Decorator パターン
Decorator パターン
Step 1
MyMain
public class MyMain { public static void main(String args[]) { MyClassA classA = new MyClassA(); System.out.println(classA.getName()); // classA を 拡張したクラス classA = new MyClassAex(); System.out.println(classA.getName()); MyClassB classB = new MyClassB(); System.out.println(classB.getName()); // classA を拡張したクラスは // classB に対して 使用できない } }
MyClassA
public class MyClassA { public String getName() { return "Suzuki"; } }
MyClassAex
// classA を 拡張したクラス public class MyClassAex extends MyClassA{ public String getName() { return "☆" + super.getName() + "☆"; } }
MyClassB
public class MyClassB { public String getName() { return "Tanaka"; } }
実行結果
L:\>java MyMain Suzuki ☆Suzuki☆ Tanaka
Step 2 「Decorator パターン」
MyMain
public class MyMain { public static void main(String args[]) { MyClass classA = new MyClassA(); System.out.println(classA.getName()); // classA を 拡張したクラス classA = new MyDecorator(classA); System.out.println(classA.getName()); classA = new MyClassB(); System.out.println(classA.getName()); // classA を拡張したクラス classA = new MyDecorator(classA); System.out.println(classA.getName()); } }
MyClass
public interface MyClass { public String getName(); }
MyClassA
public class MyClassA implements MyClass { public String getName() { return "Suzuki"; } }
MyDecorator
// classA を 拡張したクラス // classA と 同じインターフェースを使用 public class MyDecorator implements MyClass { private MyClass target; public MyDecorator(MyClass target) { this.target = target; } public String getName() { return "☆" + target.getName() + "☆"; } }
MyClassB
// classA と 同じインターフェースを使用 public class MyClassB implements MyClass { public String getName() { return "Tanaka"; } }
実行結果
L:\>java MyMain Suzuki ☆Suzuki☆ Tanaka ☆Tanaka☆