-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
360 lines (290 loc) · 16.4 KB
/
Copy pathSolution.java
File metadata and controls
360 lines (290 loc) · 16.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
//He said to them, "Cast the net on the right side of the boat, and you will find some." They cast it therefore, and now they weren't able to draw it in for the multitude of fish. (John 21:6)
-----------------------------------------------Solution.java-------------------------------------------------------
package com.javarush.task.task24.task2408;
import java.util.List;
/*
Как избежать Copy+Paste
*/
public class Solution {
public static void main(String[] args) {
List<Pet> pet = Util.getPets();
List<Sayable> pets = Util.convertPetToSayable(pet);
Util.printDialog(pets);
}
}
-------------------------------------------------------------------------------------------------------------------
------------------------------------------------Mouse.java---------------------------------------------------------
package com.javarush.task.task24.task2408;
/*
обратите внимание, как именно Mouse отличается от Dog
Этот класс - привычный для вас.
*/
public class Mouse implements Pet, Sayable {
@Override
public Sayable toSayable(int i) {
return this;
}
@Override
public String say() {
return "Мышь пищит.";
}
}
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------Pet.java----------------------------------------------------------
package com.javarush.task.task24.task2408;
public interface Pet {
public Sayable toSayable(int i);
}
-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------Sayable.java-----------------------------------------------------
package com.javarush.task.task24.task2408;
public interface Sayable {
String say();
}
-------------------------------------------------------------------------------------------------------------------
---------------------------------------------------Dog.java--------------------------------------------------------
package com.javarush.task.task24.task2408;
/*
В работе вам иногда будет нужно закастить класс к какому-нибудь другому классу, не интерфейсу :)))
Класс DogPet использует 2 класса - SuperDog и Dog, разберись с getName в классе DogPet
Так намного лучше, чем Copy+Paste!
*/
import java.util.*;
public class Dog implements Pet {
private String name;
public Dog(String name) {
this.name = name;
}
/**
* Если так получилось, что есть готовый класс А (тут SuperDog) с логикой, которую вы хотите использовать.
* То возможны 3 способа:
* 1) из класса А скопировать логику себе (это плохо, т.к. поддерживать несколько копий одного и того же кода проблематично)
* 2) создать экземпляр класса А внутри нашего класса и использовать его, связь has-a (не всегда подходит, т.к. класс А сам по себе)
* 3) создать внутренний класс, который наследуется от А, использовать его методы вместе с
* методами и полями нашего класса, т.к. внутренний класс имеет доступ к своему родителю как наследник,
* а также ко всем полям и методам включая private того класса, в который он вложен.
* <p/>
* Итак, разбираемся с п.3:
* Внутри метода toSayable создайте class DogPet, который наследуется от SuperDog и реализует интерфейс Sayable
* создайте метод private String getName(), который будет использовать логику двух классов - Dog и SuperDog.
* Пусть этот метод возвращает имя собаки (класс Dog), которое с обеих сторон выделено getSuperQuotes (класс SuperDog)
* Пример, " *** Барбос *** "
* Логика метода say:
* Если i < 1, то используя метод getName вывести на экран, что собака спит. Пример, " *** Шарик *** спит."'
* Иначе вывести фразу: "имя_собаки лает гааав! сегодняшняя_дата". Пример для i=3, " *** Тузик *** лает гааав! 13-ноя-2013 Ср"
* Для форматирования даты используйте formatter из класса SuperDog.
* <p/>
* <b>Пример вывода:</b>
* *** Барбос *** лает гааааав! 13-ноя-2013 Ср
* *** Тузик *** лает гаав! 13-ноя-2013 Ср
* *** Бобик *** лает гааав! 13-ноя-2013 Ср
* Мыша пищит.
* *** Шарик *** спит.
*
* @param i количество букв 'а' в слове гав
* @return экземпляр класса DogPet
*/
public Sayable toSayable(final int i) {
class DogPet extends SuperDog implements Sayable {
private String getName() {
return getSuperQuotes() + Dog.this.name + getSuperQuotes();
}
@Override
public String say() {
if (i < 1)
return getName() + " спит.";
else {
StringBuffer sbuf = new StringBuffer();
for (int j = 0; j < i; j++)
sbuf.append("а");
return getName() + " лает г" + sbuf + "в! " + formatter.format(new Date());
}
}
}
return new DogPet();
}
}
-------------------------------------------------------------------------------------------------------------------
----------------------------------------------------SuperDog.java--------------------------------------------------
package com.javarush.task.task24.task2408;
import java.text.SimpleDateFormat;
public abstract class SuperDog {
protected String getSuperQuotes() {
//some logic here
return " *** ";
}
protected SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy EEE");
}
-------------------------------------------------------------------------------------------------------------------
---------------------------------------------------Util.java-------------------------------------------------------
package com.javarush.task.task24.task2408;
import java.util.LinkedList;
import java.util.List;
public class Util {
//Util отлично работает с классами Dog, Mouse.
public static void printDialog(List<Sayable> pets) {
for (int i = 0; i < pets.size(); i++) {
System.out.println(pets.get(i).say());
}
}
public static List<Pet> getPets() {
List<Pet> pets = new LinkedList<>();
pets.add(new Dog("Барбос"));
pets.add(new Dog("Тузик"));
pets.add(new Dog("Бобик"));
pets.add(new Mouse());
pets.add(new Dog("Шарик"));
return pets;
}
public static List<Sayable> convertPetToSayable(List<Pet> pets) {
List<Sayable> result = new LinkedList<>();
for (Pet pet : pets) {
int i = (int) (Math.random() * 7) - 2;
result.add(pet.toSayable(i));
}
return result;
}
}
-------------------------------------------------------------------------------------------------------------------
/*
Как избежать Copy+Paste
В классе Dog реализуй логику метода toSayable, которая описана в джавадоке.
Требования:
1. В классе Dog должен быть реализован публичный метод toSayable с одним параметром типа int.
2. Метод toSayable должен возвращать объект типа Sayable.
3. Объект возвращаемый методом toSayable должен быть потомком класса SuperDog.
4. В случае, если параметр переданный в метод toSayable меньше 1, метод say должен вернуть строку с сообщением о том что собака спит (формат согласно javadoc).
5. В случае, если параметр переданный в метод toSayable больше либо равен 1, метод say должен вернуть строку с сообщением о том что собака лает и текущую дату (формат согласно javadoc).
6. Программа должна выводить данные на экран.
7. В методе getName класса DogPet должен быть вызван метод getSuperQuotes класса SuperDog.
-----------------------------------------------Solution.java-------------------------------------------------------
package com.javarush.task.task24.task2408;
import java.util.List;
/*
Как избежать Copy+Paste
*/
public class Solution {
public static void main(String[] args) {
List<Pet> pet = Util.getPets();
List<Sayable> pets = Util.convertPetToSayable(pet);
Util.printDialog(pets);
}
}
-------------------------------------------------------------------------------------------------------------------
------------------------------------------------Mouse.java---------------------------------------------------------
package com.javarush.task.task24.task2408;
/*
обратите внимание, как именно Mouse отличается от Dog
Этот класс - привычный для вас.
*/
public class Mouse implements Pet, Sayable {
@Override
public Sayable toSayable(int i) {
return this;
}
@Override
public String say() {
return "Мышь пищит.";
}
}
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------Pet.java----------------------------------------------------------
package com.javarush.task.task24.task2408;
public interface Pet {
public Sayable toSayable(int i);
}
-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------Sayable.java-----------------------------------------------------
package com.javarush.task.task24.task2408;
public interface Sayable {
String say();
}
-------------------------------------------------------------------------------------------------------------------
---------------------------------------------------Dog.java--------------------------------------------------------
package com.javarush.task.task24.task2408;
/*
В работе вам иногда будет нужно закастить класс к какому-нибудь другому классу, не интерфейсу :)))
Класс DogPet использует 2 класса - SuperDog и Dog, разберись с getName в классе DogPet
Так намного лучше, чем Copy+Paste!
*/
public class Dog implements Pet {
private String name;
public Dog(String name) {
this.name = name;
}
/**
* Если так получилось, что есть готовый класс А (тут SuperDog) с логикой, которую вы хотите использовать.
* То возможны 3 способа:
* 1) из класса А скопировать логику себе (это плохо, т.к. поддерживать несколько копий одного и того же кода проблематично)
* 2) создать экземпляр класса А внутри нашего класса и использовать его, связь has-a (не всегда подходит, т.к. класс А сам по себе)
* 3) создать внутренний класс, который наследуется от А, использовать его методы вместе с
* методами и полями нашего класса, т.к. внутренний класс имеет доступ к своему родителю как наследник,
* а также ко всем полям и методам включая private того класса, в который он вложен.
* <p/>
* Итак, разбираемся с п.3:
* Внутри метода toSayable создайте class DogPet, который наследуется от SuperDog и реализует интерфейс Sayable
* создайте метод private String getName(), который будет использовать логику двух классов - Dog и SuperDog.
* Пусть этот метод возвращает имя собаки (класс Dog), которое с обеих сторон выделено getSuperQuotes (класс SuperDog)
* Пример, " *** Барбос *** "
* Логика метода say:
* Если i < 1, то используя метод getName вывести на экран, что собака спит. Пример, " *** Шарик *** спит."'
* Иначе вывести фразу: "имя_собаки лает гааав! сегодняшняя_дата". Пример для i=3, " *** Тузик *** лает гааав! 13-ноя-2013 Ср"
* Для форматирования даты используйте formatter из класса SuperDog.
* <p/>
* <b>Пример вывода:</b>
* *** Барбос *** лает гааааав! 13-ноя-2013 Ср
* *** Тузик *** лает гаав! 13-ноя-2013 Ср
* *** Бобик *** лает гааав! 13-ноя-2013 Ср
* Мыша пищит.
* *** Шарик *** спит.
*
* @param i количество букв 'а' в слове гав
* @return экземпляр класса DogPet
*/
public Sayable toSayable(final int i) {
return null;
}
}
-------------------------------------------------------------------------------------------------------------------
----------------------------------------------------SuperDog.java--------------------------------------------------
package com.javarush.task.task24.task2408;
import java.text.SimpleDateFormat;
public abstract class SuperDog {
protected String getSuperQuotes() {
//some logic here
return " *** ";
}
protected SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy EEE");
}
-------------------------------------------------------------------------------------------------------------------
---------------------------------------------------Util.java-------------------------------------------------------
package com.javarush.task.task24.task2408;
import java.util.LinkedList;
import java.util.List;
public class Util {
//Util отлично работает с классами Dog, Mouse.
public static void printDialog(List<Sayable> pets) {
for (int i = 0; i < pets.size(); i++) {
System.out.println(pets.get(i).say());
}
}
public static List<Pet> getPets() {
List<Pet> pets = new LinkedList<>();
pets.add(new Dog("Барбос"));
pets.add(new Dog("Тузик"));
pets.add(new Dog("Бобик"));
pets.add(new Mouse());
pets.add(new Dog("Шарик"));
return pets;
}
public static List<Sayable> convertPetToSayable(List<Pet> pets) {
List<Sayable> result = new LinkedList<>();
for (Pet pet : pets) {
int i = (int) (Math.random() * 7) - 2;
result.add(pet.toSayable(i));
}
return result;
}
}
-------------------------------------------------------------------------------------------------------------------
*/