デザインパターンのデコレータパターン
目次
2.1。解決策1-スターバックスのコーヒー注文の問題を解決するための分析
2.2。解決策2-スターバックスのコーヒー注文を解決する(良い点)
2.3。デコレータモデルはスターバックスのコーヒー注文を解決します(最終計画)
3.スターバックス問題を解決するためのモディファイアモデルの具体的な実現
第4に、JDKアプリケーションのデコレータパターンのソースコード分析
1.デコレータパターンの定義
1)デコレータモード:新しい関数をオブジェクトに動的にアタッチします。オブジェクト関数の拡張に関しては、継承よりも柔軟性があり、デコレータモデルは開閉(ocp)の原則も具体化しています。
2)ここで言及されているオブジェクトとocpに新しい関数を動的にアタッチする原理
第二に、スターバックスの問題
スターバックスコーヒー注文商品(カフェ):
1)コーヒータイプ/単品コーヒー:エスプレッソ(イタリアンエスプレッソ)、ショートブラック、ロングブラック(アメリカンコーヒー)、カフェイン抜き(原因不明のコーヒー)
2)調味料:ミルク、豆乳(豆乳)、チョコレート
3)新しいタイプのコーヒーを拡張するときは、優れた拡張性、簡単な変更、簡単なメンテナンスが必要です。4)OOを使用して、さまざまなタイプのコーヒーのコストを計算します。顧客はシングルオリジンコーヒーまたはシングルオリジンコーヒーを注文できます。コーヒー+調味料の組み合わせ。
2.1。解決策1-スターバックスのコーヒー注文の問題を解決するための分析
1)飲み物は、飲み物を表す抽象クラスです。
2)desは、コーヒーの名前など、コーヒーの説明です。
3)cost()メソッドはコストを計算するためのものであり、Drinkクラスで抽象メソッドが作成されます。
4)カフェイン抜きはシングルオリジンコーヒーで、ドリンクを受け継ぎ、コストを実現します
5)エスプレス&&ミルクは単品のコーヒー+調味料で、この組み合わせはたくさんあります
6)問題:このデザインでは、多くの種類があります。シングルオリジンコーヒーや新しい調味料を追加すると、種類の数が2倍になり、クラスが爆発的に増加します。
2.2。解決策2-スターバックスのコーヒー注文を解決する(良い点)
オプション1の以前の分析では、コーヒーの単一製品と調味料の組み合わせによりカテゴリが2倍になるため、カテゴリが2倍になり、カテゴリの数が過剰にならないように、調味料がドリンクカテゴリに組み込まれます。これにより、プロジェクトの保守性が向上します(写真を参照)。
オプション2の問題分析
1)オプション2は、クラスが多すぎないように、クラスの数を制御できます。
2)調味料タイプを追加または削除する場合、コードのメンテナンス量が非常に多くなります
3)ユーザーが複数のソースを追加できることを考慮して、hasMilkを対応するintに返すことができます
4)デコレータモードの使用を検討する
2.3。デコレータモデルはスターバックスのコーヒー注文を解決します(最終計画)
デコレータパターンの原則
1)デコレータモードは速達便の梱包に似ています本体:セラミック、衣服(コンポーネント)//装飾された人梱包:新聞の詰め物、プラスチックフォーム、段ボール、木板(デコレータ)
2)コンポーネント本体:たとえば、前のドリンクと同様
3)ConcreteComponentおよびDecorator ConcreteComponent:以前の単一製品のコーヒーなどの特定の本体Decorator:スパイスなどのデコレータ。
4)図に示すようにComponentとConcreteComponentの間に、ConcreteComponentクラスが多数ある場合は、共通部分を抽出するためのバッファーレイヤーと、抽象レイヤー内の1つのクラスを設計することもできます。
3.スターバックス問題を解決するためのモディファイアモデルの具体的な実現
飲み物のカテゴリ:
public abstract class Drink {
public String des; // 描述
private float price = 0.0f;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
//计算费用的抽象方法
//子类来实现
public abstract float cost();
}
コーヒーカテゴリー:
public class Coffee extends Drink {
@Override
public float cost() {
// TODO Auto-generated method stub
return super.getPrice();
}
}
エスプレッソ :
public class Espresso extends Coffee {
public Espresso() {
setDes(" 意大利咖啡 ");
setPrice(6.0f);
}
}
ロングブラック:
public class LongBlack extends Coffee {
public LongBlack() {
setDes(" longblack ");
setPrice(5.0f);
}
}
デコレータ:
public class Decorator extends Drink {
private Drink obj;
public Decorator(Drink obj) { //组合
// TODO Auto-generated constructor stub
this.obj = obj;
}
@Override
public float cost() {
// TODO Auto-generated method stub
// getPrice 自己价格
return super.getPrice() + obj.cost();
}
@Override
public String getDes() {
// TODO Auto-generated method stub
// obj.getDes() 输出被装饰者的信息
return des + " " + getPrice() + " && " + obj.getDes();
}
}
マイク:
public class Milk extends Decorator {
public Milk(Drink obj) {
super(obj);
// TODO Auto-generated constructor stub
setDes(" 牛奶 ");
setPrice(2.0f);
}
}
チョコレート:
//具体的Decorator, 这里就是调味品
public class Chocolate extends Decorator {
public Chocolate(Drink obj) {
super(obj);
setDes(" 巧克力 ");
setPrice(3.0f); // 调味品 的价格
}
}