- - - 次の日 - - -
————————————
デコレータパターンに含まれるコアの役割は何ですか?
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基本データ型の読み取りなどの追加機能を提供します。
- - -終わり - - -