シンプルなデザインのデコレータが理解パターンと使用

1. Decoratorパターンとは何ですか

デコレーター(Decoratorパターン)は、その構造を変更せずに、既存のオブジェクトに新しい機能を可能にします。デザインパターンのこのタイプは、それが従来のクラスとしてパッケージ化され、構造モデルに属します。

このパターンは、装飾的な元のクラスをラップするために使用され、クラスメソッドの追加機能を提供する完全性を維持するための前提の下で署名を作成します。

KXaGjK.png

重要な部分2、Decoratorパターン

①デコレータの機能:

(1)装飾品と本物のオブジェクトが同じインターフェースを有しています。クライアントは、同じようにオブジェクトと実際のオブジェクトのことができるようになり、装飾品は相互に作用するように。

(2)装飾的な目的は、実際のオブジェクト参照(基準)を含有します

(3)装飾的なオブジェクトは、クライアントからのすべての要求を受け入れます。これは、実際のオブジェクトにこれらの要求を転送します。

(4)装飾的なオブジェクトは、前または要求を転送した後に機能を追加することができます。これは、実行時に指定されたオブジェクトの構造を変更することなく、外部からの追加機能を追加できるようになります。オブジェクト指向の設計では、典型的には、所与のクラスによって達成された機能拡張を継承。

②デコレータデコレータとからなるアセンブリによって:
  • 抽象コンポーネント(成分):装飾されるべき抽象オブジェクト。
  • 特定のコンポーネント(ConcreteComponent):私たちは、装飾品を必要としています。
  • 抽象装飾(デコレータ):抽象コンポーネントの参照とメソッドのデコレータ共通点が含まれています。
  • 装飾的なコンクリート(ConcreteDecorator):オブジェクトが飾られます。

具体的な実装モード3.装飾

ライフデコレータ小さな例:

道路上の車の安定した流れは、私たちの生活はいつも忙しくしています。最後の休日を持っている。私たちは遊ぶために車を追い出したが、自分の世界と全く同じではない、常に何か違う感じを取得したいです。だから我々は独特の最後に、我々はそれを再生運転した、ハンサムなカーレースの質感へのパターンに応じて、塗料を買いました!

package jiagouxiancheng.month_11.day1103.zhuangshiqi;


interface Car {
    void run();
}


class BMWCar implements Car {
    @Override
    public void run() {
        System.out.println("宝马开动...");
    }
}

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

/**
 * 赛车油漆涂料
 */
class PaintDecorator implements Car {

    protected Car car;

    public PaintDecorator(Car car) {
        this.car = car;
    }

    @Override
    public void run() {
        car.run();
    }

}

class CoolPanintDecorator extends PaintDecorator {

    public CoolPanintDecorator(Car car) {
        super(car);
    }

    @Override
    public void run() {
        cooolPanint();
        car.run();
    }

    private void cooolPanint() {
        System.out.print("刷上帅气的赛车图案的油漆->");
    }


}

/**
 * 给车来个酷酷的造型
 */
public class DriveCar {

    public static void main(String[] args) {

        System.out.println("公路上的车川流不息...");
        Car bmwCar = new BMWCar();
        Car benzCar = new BenzCar();
        bmwCar.run();
        benzCar.run();
        System.out.println("这次我们先给车来个酷酷的造型!");
        Car car = new CoolPanintDecorator(benzCar);
        car.run();

    }
}
出力:
公路上的车川流不息...
宝马开动...
奔驰开动...
这次我们先给车来个酷酷的造型!
刷上帅气的赛车图案的油漆->奔驰开动...
4.まとめ

利点①:装飾および装飾がお互いに結合されていない、独立して開発することができ、装飾的なパターンは、装飾パターンが動的機能クラスを達成するために拡張することができ、別のモデルを継承しています。

②短所:多層装飾コンプレックス。

使用すること③:1、クラスの拡張。2、動的増加機能、動的が失効。

おすすめ

転載: www.cnblogs.com/charlypage/p/11787589.html