1定義
ラッパーパターンとも呼ばれるデコレータパターンは、継承の代替手段です。これは、オブジェクトの構造を変更せずに、オブジェクトにいくつかの関数を動的に追加することを指します。
2長所と短所
2.1利点
- デコレータは継承を強力に補完するものであり、継承よりも柔軟性があります。元のオブジェクトを変更することなく、機能をオブジェクトに動的に拡張し、プラグアンドプレイできます。
- 非装飾クラスと、これらの装飾クラスの順列と組み合わせを使用することで、さまざまな効果を実現できます。
- デコレータパターンは、オープンクローズの原則に完全に準拠しています
2.2デメリット
- デコレータパターンは多くのサブクラスを追加し、使いすぎるとプログラムの複雑さが増します。
3デコレータパターンの構造と実装
デコレータパターンのクラス図は次のようになります。
デコレータパターンには、主に次の役割が含まれます。
- 抽象コンポーネントの役割:追加の責任を受け取る準備ができているオブジェクトを標準化するための抽象インターフェースを定義します。
- ConcreteComponentロール:抽象コンポーネントを実装し、ロールを装飾することによってそれらにいくつかの責任を追加します。
- 抽象デコレータの役割:抽象コンポーネントを継承し、具象コンポーネントのインスタンスを含みます。これにより、具象コンポーネントの機能をサブクラスに拡張できます。
- ConcreteDecoratorの役割:抽象装飾に関連するメソッドを実装し、具象コンポーネントオブジェクトに追加の責任を追加します。
4コードの実装
誰もが日本の漫画「TiejiaXiaobao」、その中の一番のロボット、カブダを見るべきでした、通常、彼は不器用ですがとてもかわいいロボットです、彼らが平和のために戦う必要があるときスターがゲームにいるとき、戦闘力の高いカブダに変身し、最後にカブダジャイアントを手に入れ、戦闘力を新たなレベルに引き上げます。この例では、変形したカブダとカブダジャイアントは通常のカブダの装飾であり、カブダの能力を高めています。
4.1KaBuDaインターフェースKaBuDa
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-07 12:01
**/
public interface KaBuDa {
/**
* 示人的形象
*/
void display();
}
4.2 CommonKaBuDa
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-07 14:49
**/
public class CommonKaBuDa implements KaBuDa{
@Override
public void display() {
System.out.println("我是普通卡布达,卡布卡布卡布");
}
}
4.3変容KaBuDa
**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-07 15:20
**/
public class TransfigurationKaBuDa extends Decorator{
public TransfigurationKaBuDa(KaBuDa kaBuDa) {
super(kaBuDa);
}
@Override
public void display() {
super.display();
System.out.println("启动超级变换形态---超级变换形态");
}
}
4.4 GiantKaBuDa
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-07 15:49
**/
public class GiantKaBuDa extends Decorator{
public GiantKaBuDa(KaBuDa kaBuDa) {
super(kaBuDa);
}
@Override
public void display() {
super.display();
System.out.println("超级卡布达巨人");
}
}
4.5メインプログラム
/**
* @program: design-pattern-learning
*
* @author: zgr
* @create: 2021-09-07 11:57
**/
public class MainClass {
public static void main(String[] args) {
System.out.println("-----------------1--------------------");
KaBuDa commonKaBuDa = new CommonKaBuDa();
commonKaBuDa.display();
System.out.println("-----------------2--------------------");
System.out.println("蜻蜓队长: 比赛开始");
System.out.println("-----------------3--------------------");
KaBuDa transfigurationKaBuDa = new TransfigurationKaBuDa(commonKaBuDa);
transfigurationKaBuDa.display();
System.out.println("-----------------4--------------------");
System.out.println("呼唤卡布达巨人");
System.out.println("-----------------5--------------------");
KaBuDa giantKaBuDa = new GiantKaBuDa(transfigurationKaBuDa);
giantKaBuDa.display();
}
}
4.6実行結果
その結果、カブダは絶えず装飾され、ついにカブダの巨人がいる無敵の状態に達したことがわかりました。
5デコレータパターンの簡略化
通常の状況では、デコレータパターンには抽象的な装飾されたインターフェイスはなく、特定の装飾されたオブジェクトのみがあります。これは、クラス(インターフェイス)を削除してサブクラスとしてComponent
扱うことを検討するためのものです。以下に示すように:Decorator
ConcreteComponent
6引用
1.「Dahuaデザインパターン」
2.デコレータパターンの詳細な説明(デコレーションデザインパターン)
3. javaデザインパターン-デコレータパターン(デコレータ)
7ソースコード
https://github.com/airhonor/design-pattern-learning/tree/main/src/com/hz/design/pattern/decorator