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☆