Compound Pattern
반복적으로 생길 수 있는 일반적인 문제를 해결하기 위한 용도로 두 개 이상의 디자인패턴을 결합하여 사용하는 것이다.
또한, 여러 패턴을 같이 사용한다고 해서 compound pattern이 되는 것이 아닌, 문제를 해결하기 위한 용도로 사용하여야 한다.
//Quckable interface
public interface Quackable {
public void quack();
}
//implement Quackable interface
public class MallardDuck implements Quackable {
@Override
public void quack() {
System.out.println("Quack");
}
}
public class RedheadDuck implements Quackable {
@Override
public void quack() {
System.out.println("quack");
}
}
public class RubberDuck implements Quackable{
@Override
public void quack() {
System.out.println("Squeak");
}
}
public class DuckCall implements Quackable{
@Override
public void quack() {
System.out.println("Kwak");
}
}
//goose adapter to bind Duck class
/*
한 class의 interface를 client에서 사용하고 하는 다른 interface로 변환한다.
adapter를 이용하면 interface의 호환성 문제 때문에 같이 사용할 수 없는 class를 쓸 수 있다.
*/
public class GooseAdapter implements Quackable {
Goose goose;
public GooseAdapter(Goose goose) {
this.goose = goose;
}
@Override
public void quack() {
goose.honk();
}
}
//add goose
public class Goose {
public void honk() {
System.out.println("Honk");
}
}
//abstract factory pattern
//구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성하거나
//서로 독립적인 객체들의 집합을 생성할 수 있는 인터페이스를 제공한다.
public abstract class AbstractDuckFactory {
public abstract Quackable createMallardDuck();
public abstract Quackable createRedheadDuck();
public abstract Quackable createDuckCall();
public abstract Quackable createRubberDuck();
}
public class CountingDuckFactory extends AbstractDuckFactory{
@Override
public Quackable createMallardDuck() {
return new QuackCounter(new MallardDuck());
}
@Override
public Quackable createRedheadDuck() {
return new QuackCounter(new RedheadDuck());
}
@Override
public Quackable createDuckCall() {
return new QuackCounter(new DuckCall());
}
@Override
public Quackable createRubberDuck() {
return new QuackCounter(new RubberDuck());
}
}
//run
public class DuckSimulator {
public static void main(String [] args) {
DuckSimulator simulator = new DuckSimulator();
AbstractDuckFactory duckFactory = new CountingDuckFactory();
simulator.simulator(duckFactory);
}
void simulator(AbstractDuckFactory duckFactory) {
Quackable mallardDuck = duckFactory.createMallardDuck();
Quackable redheadDuck = duckFactory.createRedheadDuck();
Quackable duckCall = duckFactory.createDuckCall();
Quackable rubberDuck = duckFactory.createRubberDuck();
Quackable gooseDuck = new GooseAdapter(new Goose());
System.out.println("\nDuck Simulator");
simulator(mallardDuck);
simulator(redheadDuck);
simulator(duckCall);
simulator(rubberDuck);
simulator(gooseDuck);
System.out.println("The Ducks quacked " + QuackCounter.getQuacks() + " times");
}
void simulator(Quackable duck) {
duck.quack();
}
}
결과화면
UML