Decoratorパターンのサンプルコードです。
package org.example.decorator;
public abstract class Component {
public abstract void method1();
public abstract void method2();
}
package org.example.decorator;
public class ConcreteComponent extends Component {
@Override
public void method1() {
}
@Override
public void method2() {
}
}
package org.example.decorator;
public abstract class Decorator extends Component {
protected Component component;
protected Decorator(Component component) {
super();
this.component = component;
}
}
package org.example.decorator;
public class ConcreteDecorator extends Decorator {
protected ConcreteDecorator(Component component) {
super(component);
}
@Override
public void method1() {
}
@Override
public void method2() {
}
}
package org.example.decorator;
public class Main {
public static void main(String[] args)
{
Component component = new ConcreteComponent();
Component instance = new ConcreteDecorator(component);
instance.method1();
instance.method2();
Component component1 = new ConcreteDecorator(new ConcreteDecorator(component));
component1.method1();
component1.method2();
}
}
このパターンでは、中身(ConcreteComponent)と装飾(ConcreteDecorator)が存在し、Componentという共通のインターフェースを持っています。
機能を追加する場合はDecoreterを継承したクラスを作成し、機能を拡張することができます。
ConcreteDecoratorのコンストラクタにはConcreteComponentを渡すこともできますし、すでに作成したConcreteDecoratorを渡すこともでき、それによって再帰的な処理をすることもできます。
しかし、クラスの関係が複雑になったりするので、クラス図による整理が必要になりますね。