ホームページ  >  記事  >  Java  >  Javaデザインパターンにおける装飾パターンの原理と実装方法は何ですか?

Javaデザインパターンにおける装飾パターンの原理と実装方法は何ですか?

WBOY
WBOY転載
2023-04-22 10:52:081114ブラウズ

1. デコレーション モードとは

オブジェクトの機能を改善または強化したいが、クラスを継承してサブクラスを作成したくない場合は、デコレーション モードの使用を検討できます。

装飾モードを使用してオブジェクトの特定の機能を強化することは、サブクラスを生成してそれを強化するよりも柔軟です。

2. 実装方法

1) 抽象コンポーネント: 「デコレータ」を「装飾」する必要があるメソッドを定義する抽象クラスを定義します

2 ) 具象コンポーネント: 抽象コンポーネントのサブクラス。 「装飾クラス」になる

3) 装飾コンポーネント: 抽象コンポーネントのサブクラスでもあります。このクラスは「デコレータ」への参照を保持し、デコレータのメソッドを呼び出すために使用されます。抽象クラスまたは非抽象クラスのいずれかにすることができます。

4) 具体的な装飾クラス: 「デコレータ」と呼ばれる装飾コンポーネントのサブクラスです

3. コード実装

1) 抽象コンポーネント

/**
 * 抽象组件,定义了被装饰类需要装饰的方法
 */
public abstract class ICake {
    /**
     * 需要装饰的方法
     * @return
     */
    public abstract int getPrice();
}

2) 装飾された人物

/**
 * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法
 */
public class Cake extends ICake {
    /**
     * 被装饰类中,装饰方法的基本实现
     * @return
     */
    @Override
    public int getPrice() {
        System.out.println("getPrice");
       return 100;
    }
}

3) 装飾クラス

/**
 * 装饰类,也是抽象组件的一个子类。
 * 可以是抽象类,也可以是非抽象类。
 */
public abstract class CakeDecorator extends ICake {
    /**
     * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。
     */
    ICake cake;
    public CakeDecorator(ICake cake){
        this.cake = cake;
    }
}

4) 特定の装飾

/**
 * 具体装饰类
 */
public class BlueBerryCake extends CakeDecorator {
    public BlueBerryCake(ICake cake) {
        super(cake);
    }
    /**
     * 被装饰的方法
     * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法
     * @return
     */
    @Override
    public float getPrice(){
        return cake.getPrice()+elsePrice();
    }
    /**
     * 增强的方法
     * @return
     */
    private float elsePrice(){
        System.out.println("else getPrice");
        return 50;
    }
}

5) テストクラス

public class TestDecorator {
    public static void main(String args[]){
        ICake cake = new Cake();
        CakeDecorator decorater = new BlueBerryCake(cake);
        float price = decorater.getPrice();
        System.out.println(price);
    }
}

4 .Expansion

1) 特定のメソッドの拡張は、サブクラスの継承を使用することによっても実現できます。デコレーション モードで実装する場合と比較して、デコレーション モードの利点は何ですか?

デコレータとデコレータは疎結合です。装飾クラスは抽象コンポーネントにのみ依存するため、装飾クラスが抽象コンポーネントのサブクラスであることだけを知っていればよく、それがどのサブクラスであるかはわかりません。

装飾モードは「開閉原則」を満たしているため、特定のコンポーネントを変更することなく、コンポーネントの装飾クラスを追加できます。

5.JavaIo とデコレーション モード

java.IO パッケージ内の多くのクラスは、デコレーション モードを使用します。

リーダー

ファイルリーダー

バッファリーダー

以上がJavaデザインパターンにおける装飾パターンの原理と実装方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。