コミックデザインパターン:「デコレータパターン」とは何ですか?

画像

画像

 

 

- - - 次の日 - - -

画像

画像

画像

画像

画像

画像

画像

画像

 

————————————

画像

画像

画像

画像

 

画像

画像

画像

 

画像

画像

画像

 

 

 

 

 

画像

 

画像

画像

画像画像

画像

 

デコレータパターンに含まれるコアの役割は何ですか?

 

1.コンポーネントインターフェイス

 

上記の例では、Componentインターフェースはcarインターフェースと同等であり、ラップされたすべてのクラスとパッケージングクラスはこのインターフェースを継承します。

 

2.  ConcreteComponentクラス

 

ConcreteComponentクラスは、パッケージ化された実装クラスです。この例では、メルセデスベンツ、BMW、テスラがすべてこの役割に属しています。

 

3.デコレータ抽象クラス

 

すべてのパッケージングクラスはDecorator抽象クラスを継承し、DecoratorクラスはComponentインターフェイスを実装します。これは、マルチレイヤーのネストされたパッケージングを実現するために行われます。

 

。4 。 デコレータクラスの具体化

 

特定のパッケージングカテゴリは、例の自動操縦機能やフライト機能拡張など、パッケージ化されたカテゴリの機能を拡張するために使用されます。

 

 

これらの4つのコアの役割の間の関係は何ですか?デコレータパターンのUMLクラス図を使用して、次のことを表現できます。

 

画像

画像

 

1つ目は、車のインターフェースです。これは、実行の動作を定義するコンポーネントの役割です。

 

public interface Car {
    void run();
}

 

次は、さまざまな車の実装クラス、つまり、ConcreteComponentロールです。車が異なれば、実行動作の実装も異なります。

 

public class BenzCar implements Car{
    @Override
    public void run() {
        System.out.println("奔驰开车了!");
    }
}

public class BmwCar implements Car{
    @Override
    public void run() {
        System.out.println("宝马开车了!");
    }
}

public class TeslaCar implements Car{
    @Override
    public void run() {
        System.out.println("特斯拉开车了!");
    }
}

 

以下は、デコレータの抽象クラスです。これは、デコレータロールであり、デコレーションされるメンバーオブジェクトが含まれています。

 

public class CarDecorator implements Car {

    protected Car decoratedCar;

    public CarDecorator(Car decoratedCar){
        this.decoratedCar = decoratedCar;
    }

    public void run(){
        decoratedCar.run();
    }
}

dsは一部の人にとっては奇妙かもしれませんが、なぜデコレータクラスもCarインターフェイスを実装する必要があるのでしょうか。これがデコレータパターンの柔軟性です。

 

Carインターフェイスから継承され、各デコレータ自体をより外側のデコレータでラップすることもできます。パッケージ化の方法は、Carオブジェクトをパラメータとして外側のデコレータのコンストラクタに渡すことです。

 

次は、ConcreteDecoratorロールであるconcretedecorator実装クラスです。これらのデコレータは実行動作も実装します。一方では、ラップされたオブジェクトのrunメソッドが呼び出され、他方では、いくつかの拡張操作(自動操縦、飛行など)が実行されます。

 

public class AutoCarDecorator extends CarDecorator {

    public AutoCarDecorator(Car decoratedCar){
        super(decoratedCar);
    }

    @Override
    public void run(){
        decoratedCar.run();
        autoRun();
    }

    private void autoRun(){
        System.out.println("开启自动驾驶");
    }}

public class FlyCarDecorator extends CarDecorator {

    public FlyCarDecorator(Car decoratedCar){
        super(decoratedCar);
    }

    @Override
    public void run(){
        decoratedCar.run();
        fly();
    }

    private void fly(){
        System.out.println("开启飞行汽车模式");
    }

}

 

最後に、クライアントクラス。クライアントクラスは、パッケージ化されたオブジェクトとデコレータを作成し、パッケージ化して実行する方法を決定する責任があります。

 

public class Client {

    public static void main(String[] args) {
        Car benzCar = new BenzCar();
        Car bmwCar = new BmwCar();
        Car teslaCar = new TeslaCar();
        //创建自动驾驶的奔驰汽车
        CarDecorator autoBenzCar = new AutoCarDecorator(benzCar);
        //创建飞行的、自动驾驶的宝马汽车
        CarDecorator flyAutoBmwCar = new FlyCarDecorator(new AutoCarDecorator(bmwCar));

        benzCar.run();
        bmwCar.run();
        teslaCar.run();
        autoBenzCar.run();
        flyAutoBmwCar.run();
    }
}

画像

画像

画像

 

画像

 

例として入力ストリームを取り上げます。さまざまな入力シナリオに対応するために、JDKはByteArrayInputStream、FileInputStreamなどのさまざまな入力ストリームを設計しました。

 

これらの入力ストリームはすべて、共通の抽象クラスであるInputStreamから継承します。

 

同時に、これらの入力ストリームに機能拡張をもたらすために、JDKはデコレータクラスFilterInputStreamを設計しましたこのクラスはInputStreamから継承し、InputStreamメンバーオブジェクトを「結合」します。

 

多くのデコレータサブクラスは、BufferedInputStream、DataInputStreamなどを含むFilterInputStreamクラスから派生し、入力ストリームのバッファリングや入力ストリームからのJava基本データ型の読み取りなどの追加機能を提供します。

画像

画像

 

- - -終わり - - -

おすすめ

転載: blog.csdn.net/taotaobaobei/article/details/112762480