home > デザインパターン >

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☆

Objective-C

D

VB

VB.NET

Delphi

Ada

PL/SQL

T-SQL

関数型

inserted by FC2 system