装飾的なパターン:(09)に記載のJavaデザインパターン

この記事の出所:GitHubにはこちらをクリック・ || GitEE・こちらをクリック

生活シーン

1、シーン記述

猿王七十のような変更は、彼の各変更は彼に追加のスキルを与えました。彼は魚になると、あなたは水で泳いで行くことができ、彼は鳥になったとき、あなたは空を飛ぶことができます。

2、シーンを示します

図3に示すように、コードの実装

public class C01_InScene {
    public static void main(String[] args) {
        TheGreatestSage greatestSage = new Monkey();
        TheGreatestSage fish = new Fish(greatestSage);
        fish.shapeDesc();
        // 这里虽然是鱼形态,但是本体是悟空,所以可以直接变化
        TheGreatestSage bird = new Bird(fish);
        bird.shapeDesc();
    }
}
// 顶级接口
interface TheGreatestSage {
    // 定义一个描述形态的方法
    void shapeDesc ();
}
// 悟空本尊
class Monkey implements TheGreatestSage{
    @Override
    public void shapeDesc() {
        System.out.println("Monkey.move()");
    }
}
// 包装一层变化的描述
class Change implements TheGreatestSage {
    private TheGreatestSage greatestSage;
    Change(TheGreatestSage greatestSage){
        this.greatestSage = greatestSage;
    }
    @Override
    public void shapeDesc() {
        greatestSage.shapeDesc();
    }
}
// 具体的变化形态
class Fish extends Change{
    public Fish(TheGreatestSage greatestSage) {
        super(greatestSage);
    }
    public void shapeDesc(){
        System.out.println("鱼在水中游...");
    }
}
class Bird extends Change{
    public Bird(TheGreatestSage greatestSage) {
        super(greatestSage);
    }
    public void shapeDesc(){
        System.out.println("鸟在空中飞...");
    }
}

第二に、装飾的なパターン

1、基本的な考え方

また、パッケージング(ラッパー)モードとして知られている装飾的なパターン、。クライアントへの装飾的なパターンは、透過オブジェクトの機能を拡張し、それが代替継承関係です。
動的オブジェクトに追加の責任を添付するために、透明性の高い方法で顧客の装飾パターン。言い換えれば、クライアントは、前の装飾品を感じていないとリアには何が違うのトリム。装飾的なパターンの場合に拡張するために、複数のサブクラスを作成するために、目的関数を使用することはできません。

2、中核的な役割

  • 抽象コンポーネントの役割

    これは、追加の責任を受け入れる準備ができて規制する抽象インタフェースを提供します。

  • 特定のコンポーネントの役割

    クラスの定義は、追加の責任を受信します。

  • 装飾的な役割

    オブジェクトを保持部材の一例、及び抽象部材との界面への一貫したインターフェースを定義します。

  • 具体的な装飾的な役割

    コンポーネントオブジェクトを担当する追加の責任を「ラベル」。

図3に示すように、パターンを示し

図4に示すように、ソースコードを達成するために

// 抽象构件角色
interface Component {
    void sampleOperation();
}
// 具体构件角色
class ConcreteComponent implements Component{
    @Override
    public void sampleOperation() {
        System.out.println("业务相关代码");
    }
}
//装饰角色
class Decorator implements Component{
    private Component component;
    public Decorator(Component component){
        this.component = component;
    }
    @Override
    public void sampleOperation() {
        //委派给构件进行处理
        component.sampleOperation();
    }
}
// 具体装饰角色
class ConcreteDecoratorA extends Decorator{
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    @Override
    public void sampleOperation() {
        super.sampleOperation();
        System.out.println("A.处理相关业务的代码");
    }
}
class ConcreteDecoratorB extends Decorator{
    public ConcreteDecoratorB(Component component) {
        super(component);
    }
    @Override
    public void sampleOperation() {
        super.sampleOperation();
        System.out.println("B.处理相关业务方法");
    }
}

図5に示すように、単純化モデル

  • 簡体抽象クラス

唯一のクラスConcreteComponent場合は、サブクラスとして抽象コンポーネントクラス(インターフェース)、デコレーターConcreteComponentを削除することを検討。

  • 装飾を簡素化

一つだけConcreteDecoratorクラスならば、そこに別のデコレータークラスの必要がなく、クラスとしてデコレータとConcreteDecorator責任をマージすることができます。

図6に示すように、半透明の説明

見つけるのは難しい1)、純粋に装飾的なパターン。インターフェイスを変更することなく、装飾的なパターンの意図は、クラスへの拡張機能の前提です。

2)、拡張機能は、多くの場合、開示する新しい方法を必要とするとき。

3)、装飾的なパターンのほとんどの実現につながったが、「半透明」のではなく、完全に透過的です。言い換えれば、インターフェースは、装飾的なパターンは、変更するには、新しいメソッドを追加することができます。これは、クライアントがタイプConcreteDecoratorの変数を宣言し、その方法のConcreteDecoratorクラスを呼び出すことができる持っていることを意味します。

4)、半透明の装飾パターンは、アダプタモードと装飾パターンとの間に介在しています。モードアダプタインターフェイスを変更することを意図して、1つのまたはいくつかの方法によって書き換えられ、または機能性クラスを強化するために新しいメソッドを追加することができます。

5)、実際には装飾的なパターンのほとんどは、このようなも半分装飾、半アダプタモードと呼ばれる装飾的なパターンのような半透明の装飾的なパターンです。

第三に、実用的なアプリケーション

IOストリーム1、JDK

1)基本説明

Java言語での装飾パターンの最も古典的なアプリケーションは、Java I / Oライブラリの設計です。いくつかの単一のストリームオブジェクトはIOが複数の重複オブジェクトを作成することにより、ストリーム所望の機能を提供するために作成され、装飾パターンが基本モードのJava I / Oライブラリです。

記載2)、IO流れ図

  • 抽象コンポーネントの役割

InputStreamが演じます。これは、サブタイプのさまざまな統一されたインターフェイスを提供する抽象クラスです。

  • 特定のコンポーネントの役割

FileInputStreamを、StringBufferInputStreamおよび他のカテゴリで演奏。これは抽象コンポーネントの役割で定義されたインタフェースを実装しています。

  • 抽象的な装飾的な役割

FilterInputStreamでプレイ。これは、指定されたInputStreamのインターフェイスを実装しています。

  • 具体的な装飾的な役割

いくつかのカテゴリ、すなわちBufferedInputStreamを、DataInputStreamをと、二つのクラスLineNumberInputStream、PushbackInputStreamに共通していないが演じます。

第四に、要約の長所と短所

1つの利点は、モード

(1)装飾的なパターンと継承の目的は、オブジェクトの機能を拡張することであるが、装飾的なパターンは、継承よりも柔軟性を提供することができます。デコレーションモードは「装飾」が必要、または不要な削除「標識された」システムを動的に決定することを可能にする「装飾を。」継承が異なる場合、継承は静的であり、システムが決定する前に上で実行されています。

(2)これらの具体的な装飾や装飾の異なる組み合わせと順列を使用することにより、エンジニアは、異なる行動の組み合わせの多くを作成することができます。

2つの利点は、モード

装飾的なパターンを使用するには、継承はクラスの数より少ない必要が使用することができます。設計が容易であることはもちろん、少数のクラスを使用します。しかし、一方で、装飾的なパターンの使用は、オブジェクトの継承以上を生産します。

第五に、ソースコードのアドレス

GitHub地址:知了一笑
https://github.com/cicadasmile/model-arithmetic-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/model-arithmetic-parent

おすすめ

転載: www.cnblogs.com/cicada-smile/p/11432933.html
おすすめ