2012-04-04 5 views
2

これはデコレータパターンの例です。
は、スーパーメソッドを呼び出すのと同じデコレータパターンですか?

public class Computer { 
public String Description(){ 
    return "Computer"; 
} 
} 

public abstract class Decorator extends Computer{ 
public abstract String description(); 
} 

public class Monitor extends Decorator{ 

Computer computer; 
public Monitor(Computer c){ 
    computer = c; 
} 

public String description() { 
    return computer.Description() + " and Monitor"; 
} 
} 

public class main { 
public static void main(String args[]){ 
    Computer c = new Computer(); 
    Monitor m = new Monitor(c); 
    System.out.println(m.description()); 
} 
} 

これは、スーパークラスのスーパーメソッドを呼び出すと同じです??コンピュータから継承されたmonitorのように、monitorクラスのDescriptionメソッド内のコンピュータクラスのsuper.Description()を呼び出します。

答えて

5

スーパーメソッドを呼び出すと、すべての可能性に対して新しいサブクラスを作成する必要があります。たとえば、モニタとマウスを備えたコンピュータが必要な場合はどうなりますか? Monitorを継承するサブクラスを作ることができます。ここでは、モニタとマウスのないコンピュータが必要だと言う。 Computerを継承する別のサブクラスも必要です。デバイスは2つしかなく、すでに3つのサブクラス(Monitor,MouseおよびMonitorAndMouse)が必要です。お使いのコンピュータにプリンタ、スキャナー、スピーカーがある場合はどうなりますか? Decoratorパターンで

、新しいデバイスとコンピュータ「を飾る」することができます。 Monitorと同じように、デバイスごとに異なるデコレータを作成できます。すべてのデバイスとコンピュータを作成するには、今現在

Computer = new Speakers(
    new Scanner(
     new Printer(
      new Mouse(
       new Monitor(
        new Computer() 
       ) 
      ) 
     ) 
    ) 
); 
computer.description(); 

description()戻りComputer and Monitor and Mouse and Printer and Scanner and Speakersような何かを行うことができます。各組み合わせに新しいサブクラスを作成する必要なく、デバイスをコンピュータと組み合わせて組み合わせることができます。

コメント

:私は代わりに私はちょうど同じことを行う、モニタクラス内のコンピュータクラスのインスタンスを入れて、コンピュータのクラスから継承didntの監視、その後デコレータのクラスを削除する方法についての私の例では

この方法では、1つのレベルまでしか移動できません。コンピュータには1つのデバイスしか追加できません。本質的に、それは拡張不可能なデコレータです。デコレータパターンは、favor composition over inheritanceへの道です。なぜなら、複数のデバイスを追加するときには、可能性が非常に大きくなるからです。あなたのソリューションでは、Computerのサブクラスを作成せず、ComputerMonitorを構成することで、継承を超えた合成を優先しています。それはほぼデコレータのパターンです、あなただけが一歩後退しました。

+0

私の例では、デコレータクラスを削除し、コンピュータクラスから継承していないモニタクラスをインスタンスに入れ、モニタクラス内にコンピュータクラスのインスタンスを配置します。 – user1293258

1

あなたの質問に簡単に答えるには:いいえ、それは同じではありません。

Aデコレータはそれをbehauviourを修正するために、既存のオブジェクトを使用していますが、外の世界のためにそれがあるかのように見えるところ、それは飾るクラスのTYP。

この例を説明するには、コンピュータがあり、コンピュータにはいくつかのプロパティがあります。コードのどこかで、このコンピュータのインスタンスを作成しています。必要なすべてのデータを入力します。

今すぐデコレータが設置されます。作成したばかりのコンピュータのこのインスタンスをデコレートするクラスが必要です。まさにこれ。

私はあなたのコンピュータを取ると、それをオフにする方法を追加し、

public class Computer { 
    private boolean isOn = true; 
    private String description = "Computer";   

    public vod turnOn(){ 
     this.isOn=true; 
    } 

    public void turnOff(){ 
     this.isOn = false; 
    } 

    public void setDescription(String description){ 
     this.description = description; 
    } 

    public String Description(){ 
     return this.description; 
    } 
} 

に今私はあなたのコンピュータの電源を切ることができないデコレータを作成しています。

public class ComputerDecorator1 extends Computer { 
    private Computer computer; 

    public ComputerDecorator1(Computer computer){ 
     this.computer = computer; 
    } 

    public vod turnOn(){ 
     this.computer.turnOn(); 
    } 

    public void turnOff(){ 
     System.out.println("You cannot turn me off!!!!"); 
    } 

    public void setDescription(String description){ 
     this.computer.setDescrition(descritption); 
    } 

    public String Description(){ 
     return this.computer.Description(); 
    } 
} 

ご覧のとおり、コンピュータインスタンスをコンストラクタに渡す必要があります。これは私たちが飾っているコンピュータです。すべてのメソッド呼び出しがこのクラスに渡されます。 通常、すべてのメソッドをデコレートされたオブジェクトに渡すメソッドを上書きする必要があります。この場合、コンピュータ。

これを使用して、オブジェクトの動作を変更し、新しいクラスを作成することができます。 利点は、他の場所からコンピュータのインスタンスを取得したときにこのフィルタを追加できるため、他のプログラマがこのフィルタをオフにできないことです。

これは、あなたのプログラムにデコレータを使用する方法である:

public void getMyComputerAndTurnItOff(){ 
    Computer myComputer = getMyComputer(); 
    myComputer.turnOff(); 
} 

public Computer getMyComputer(){ 
    //Here you will load a Computer from an other class 
    Computer computer = this.otherClass.loadComputerFromDB(); 

    //Now we could return it, but what if you shouldn't be able to turn it off? 
    //easy add our decorator 
    return new ComputerDecorator1(computer); 
} 

あなたが行動を変更する必要がデコレータを使用したい場合は、それ以外の場合は無用です! 論理ポイントからのコンピュータとモニタの例では、コンピュータのモニタをデコレータにすることはできません。私にとっては、これらは2つの異なるオブジェクトです。

デコレータが何であるかを少しはっきりと分かりやすくしたいと思っています。

関連する問題