動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。不改變介面的前提下,增強所考慮的類的效能。
何時使用:
1)需要擴充套件乙個類的功能,或給乙個類增加附加責任。
2)需要動態的給乙個物件增加功能,這些功能可以再動態地撤銷。
3)需要增加一些基本功能的排列組合而產生的非常大量的功能,從而使繼承變得 不現實。
例項場景:
例如買了乙個新手機,有時想給手機新增點裝飾於是貼膜、貼等小掛件來增加手機美感
傳統實現方式:
在平常實現方式中我們一般定義乙個手機類介面,介面中定義好貼膜、新增貼圖的方法**如下:
namespace designer.decorationpattern
void addstick();
void addpicture();
}public
class phone:iphone
////// 新增貼膜
///public
void
addstick()
手機貼膜");
console.writeline($"給手機貼膜完畢");
}///
/// 新增貼圖
///public
void
addpicture()
手機貼");
console.writeline($"給手機貼完畢");}}
public
static
class signup
;//給安卓手機貼膜
andriodphone.addstick();
//給安卓新增
andriodphone.addpicture();
console.readline();}}
}
執行結果:
該方法是傳統實現方式但是如果我想新增乙個給手機去除貼膜的方法;那麼我們是不是需要在介面中在新增給方法;然後在繼承類中實現在方法呢;如果這樣我們在不斷新增新的方法;那麼我們還要不斷給介面新增方法,然繼承類實現方法;那麼這樣做起來是不是違反設計模式開閉原則呢。
裝飾者模式:
裝飾者模式就是在保持原有類或者功能不變的情況下新增類或元件來達到擴充套件功能的需求。
看下面**實現:
namespace designer.decorationpattern
}public
class phonedecoration : iphone_decoration
}///
/// 裝飾介面
///public
inte***ce idecoration
public
class stick : idecoration
手機貼膜");
console.writeline($"給手機貼膜完畢");}}
}public
class picture : idecoration
手機貼");
console.writeline($"給手機貼完畢");}}
}public
class decorationway
;//給安卓手機貼膜
stickdecoration.addfunction(andriodphone);
//給安卓新增
picturedecoration.addfunction(andriodphone);
console.readline();}}
}
執行結果:
上面通過新增idecoration介面以及實現類來達到給手機新增裝飾同時又沒有修改核心功能。
設計模式 裝飾者模式
public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...
設計模式 裝飾者模式
沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...
設計模式 裝飾者模式
好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...