ForNext
Only Do What Only You Can Do
Decorator
VBScript
JScript
Perl
PHP
Python
Ruby
PowerShell
Scala
F#
C
C++
C++Builder
VC++
C#
Java
更新日 : 2010.11.25
■ Step 1 パターン適用前
■ 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"; } }
■ 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 に対して 使用できない } }
L:\>java MyMain Suzuki ☆Suzuki☆ Tanaka
■ Step 2 Decorator
■ MyClass (追加)
public interface MyClass { public String getName(); }
■ MyClassA (変更)
public class MyClassA implements MyClass { public String getName() { return "Suzuki"; } }
■ MyClassB (変更)
// classA と 同じインターフェースを使用 public class MyClassB implements MyClass { public String getName() { return "Tanaka"; } }
■ MyDecorator (MyClassAexを変更)
// classA を 拡張したクラス // classA と 同じインターフェースを使用 public class MyDecorator implements MyClass { private MyClass target; public MyDecorator(MyClass target) { this.target = target; } public String getName() { return "☆" + target.getName() + "☆"; } }
■ 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()); } }
L:\>java MyMain Suzuki ☆Suzuki☆ Tanaka ☆Tanaka☆