前回の記事はプロキシ パターンについてでしたが、今日の記事はそれによく似たデザイン パターンである装飾パターンについて説明します。プロキシモードリンク
デコレータパターン
装飾モードは比較的一般的なデザイン モードです。追加の責任をオブジェクトに動的に追加するように設計されています。機能を追加するだけの場合は、サブクラスを生成するよりも装飾モードの方が柔軟です。
上の段落は、現在のオブジェクトではニーズを満たせないと思われる場合のシナリオ、つまり「機能の追加」を示しています。装飾モードの使用を検討してください。例えば、車のオブジェクトはすべてキーで発火しますが、需要が高まった今ではキーをスタイリッシュに表示できなくなり、指紋による発火機能にバージョンアップする必要があります。デコレーションモード。
基本クラス図:
ICar: これは私たちの中心となるオブジェクト、車のインターフェイス/抽象クラスであり、車の図面に相当する最も原始的なオブジェクトです。
Car: コア インターフェイスの実装クラスであり、最も独創的な固有の実装オブジェクトです。装飾する必要があるのはこのクラスです。コンクリートの自動車に相当します。
CarDecorate: 装飾の役割。通常は抽象クラスで、その最も重要なコンポーネントはICar プライベート変数です。なぜ Car ではないのでしょうか? 私たちはインターフェイスに向けてプログラミングしているのでしょうか?
CarDecorate A/B: 特定の装飾実装クラスです。
これは基本的なクラスとクラス図です。これを実装するための具体的なコードをいくつか見てみましょう (クラス図に対するコード実装を参照してください)。
public interface ICar {
public void fire();
}
public class Car implements ICar {
@Override
public void fire() {
System.out.println("汽车钥匙点火了。。。");
}
}
public abstract class CarDecorate implements ICar {
private ICar icar = null;
//通过构造函数,传递被修饰者
public CarDecorate(ICar _icar){
this.icar = _icar;
}
//委托给被修饰者执行方法
@Override
public void fire() {
this.icar.fire();
}
}
public class CarDecorateA extends CarDecorate{
public CarDecorateA(ICar _icar) {
super(_icar);
}
//定义自己的修饰方法
private void keyFireA(){
System.out.println("指纹A点火。。。");
}
//重写父类的fire方法
public void fire(){
this.keyFireA();
super.fire();
}
}
public class CarDecorateB extends CarDecorate{
public CarDecorateB(ICar _icar) {
super(_icar);
}
//定义自己的修饰方法
private void keyFireB(){
System.out.println("指纹B点火。。。");
}
//重写父类的fire方法
public void fire(){
this.keyFireB();
super.fire();
}
}
public class Client {
public static void main(String args[]){
ICar icar = new Car();
//第一次修饰
icar = new CarDecorateA(icar);
//第二次修饰
icar = new CarDecorateB(icar);
icar.fire();
}
}
デコレーションモードの利用シナリオ:
1. クラスの機能を拡張したり、クラスに機能を追加したりする必要がある。
2. 関数は動的に追加し、動的に取り消す必要があります。つまり、必要な場合にはこの機能を追加し、不要な場合にはこの機能を解除することができます。
3. オブジェクトのバッチを変更する必要があります。上記の自動車の例を考えてみましょう。多くの車にはすでに工場でキーイグニッションが装備されていますが、今後は指紋イグニッションに変更される予定であり、それらをすべて書き換えるのは明らかに不適切です。