본 포스팅에서는 동물 그룹을 만들고, 특정 동물
여러 동물 중, 특정 동물을 찾고 행동을 출력하는 예제를 작성한다.
AnimalBehavior.java
public interface AnimalBehavior {
void eat();
void bark(String sound);
void play();
}
AbstractAnimal.java
public abstract class AbstractAnimal<T extends AnimalBehavior> implements AnimalBehavior{
private String howling;
public AbstractAnimal(String howling) {
this.howling = howling;
}
public final void doAction () {
bark(howling);
eat();
play();
}
@Override
public abstract void eat();
@Override
public void bark(String sound) {
System.out.println(sound);
}
@Override
public abstract void play();
}
Cat.java
public class Cat extends AbstractAnimal<Cat>{
public Cat(String howling) {
super(howling);
}
@Override
public void eat() {
System.out.println("고양이 사료를 먹는다.");
}
@Override
public void play() {
System.out.println("혼자 뒹굴거린다.");
}
}
Dog.java
public class Dog extends AbstractAnimal<Dog>{
public Dog(String howling) {
super(howling);
}
@Override
public void eat() {
System.out.println("강아지 사료를 먹는다.");
}
@Override
public void play() {
System.out.println("공놀이를 한다.");
}
}
AnimalMain.java
public class AnimalMain {
public static List<AnimalBehavior> animal = new ArrayList<>();
public static void main(String args[]) {
setup();
//강아지를 찾는다.
List<Dog> dogs = searchAnimal(Dog.class);
System.out.println(dogs.size());
for(Dog dog : dogs) {
dog.doAction();
}
}
public static void setup () {
animal.add(new Cat("냐옹"));
animal.add(new Cat("냐옹냐옹"));
animal.add(new Cat("냐옹냐옹냐옹"));
animal.add(new Dog("멍"));
animal.add(new Dog("멍멍"));
animal.add(new Dog("멍멍멍"));
}
public static <T> List<T> searchAnimal (Class<T> type){
return animal.stream()
.filter(type::isInstance)
.map(type::cast)
.collect(Collectors.toList());
}
}