[+]
- 一裝飾模式簡介Brief Introduction
- 二解決的問題What To Solve
- 三裝飾模式分析Analysis
- 裝飾模式結構
- 原始碼
- 程式運行結果
- 四案例分析Example
- 五總結Summary
一、裝飾模式簡介(Brief Introduction)
動態地給一個對象添加一些額外的職責。
優點:把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功能和裝飾功能區分開了。
二、解決的問題(What To Solve)
已經開發完畢的對象,後期由於業務需要,對舊的對象需要擴充特別多的功能,這時候使用給對象動態地添加新的狀態或者行為(即裝飾模式)方法,而不是使用子類靜態繼承。
比如,剛買一輛汽車如
此汽車不符合你的個性要求,比如外表不夠美觀,發動機馬力不足,不能滿足你的速度激情,於是你需要對汽車的外表進行裝飾,同時需要提高發動機的效能。這些操作通過裝飾模式就能很好地解決問題。最終得到如所示的個性汽車。
三、裝飾模式分析(Analysis)1、裝飾模式結構
Component定義了一個對象介面,可以給這些對象動態地添加職責。
ComcreteComponent定了一個具體的對象,也可以給這個具體的對象添加職責。
Decorator抽象裝飾類,繼承了Component對象介面,從外類擴充Component類的功能,但對於Component來說,是無需知道Decorator的存在。
ConcreteDecoratorA具體的裝飾對象,起到給Component添加職責的功能。
ConcreteDecoratorB具體的裝飾對象,起到給Component添加職責的功能。
2、原始碼
1、對象介面Component.cs |
public abstract class Component { public abstract void Operation(); } |
2、實作類別ConcreteComponent.cs 繼承於Component介面 |
public class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("開始執行具體的對象..."); } } |
3、裝飾抽象類別Decorator.cs 繼承於Component介面 |
public abstract class Decorator : Component { private Component m_Component; public void SetComponent(Component component) { this.m_Component = component; } public override void Operation() { if (m_Component != null) { m_Component.Operation(); } } } |
4、具體的裝飾對象ConcreteDecoratorA.cs 繼承於Decorator抽象類別 |
public class ConcreteDecoratorA : Decorator { private string addedState; public override void Operation() { base.Operation(); addedState = "進行了狀態屬性裝飾。"; Console.WriteLine(addedState); } } |
給對象介面Component添加了狀態屬性addedState |
5、具體的裝飾對象ConcreteDecoratorB.cs 繼承於Decorator抽象類別 |
public class ConcreteDecoratorB : Decorator { public override void Operation() { base.Operation(); AddedBehavior(); } private void AddedBehavior() { Console.WriteLine("進行了操作行為裝飾。"); } } |
給對象介面Component添加了操作行為AddedBehavior() |
5、用戶端代碼 |
static void Main(string[] args) { ConcreteComponent cc = new ConcreteComponent(); ConcreteDecoratorA cda = new ConcreteDecoratorA(); ConcreteDecoratorB cdb = new ConcreteDecoratorB(); cda.SetComponent(cc); cdb.SetComponent(cda); cdb.Operation(); Console.Read(); } |
給對象介面Component添加了操作行為AddedBehavior() |
3、程式運行結果
四.案例分析(Example)
此案例對具體組件TextView進行了Border和ScrollBar的裝飾。使TextView更符合項目需求。
五、總結(Summary)
裝飾模式,給一個對象動態添加額外職責,這些職責需要由使用者決定加入的方式和時機。裝飾模式提供了“隨插即用”的方式,在運行期間決定何時增加何種功能。就增加功能來說,裝飾模式比產生子類更加靈活。
一、裝飾模式簡介(Brief Introduction)
動態地給一個對象添加一些額外的職責。
優點:把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功能和裝飾功能區分開了。
二、解決的問題(What To Solve)
已經開發完畢的對象,後期由於業務需要,對舊的對象需要擴充特別多的功能,這時候使用給對象動態地添加新的狀態或者行為(即裝飾模式)方法,而不是使用子類靜態繼承。
比如,剛買一輛汽車如
此汽車不符合你的個性要求,比如外表不夠美觀,發動機馬力不足,不能滿足你的速度激情,於是你需要對汽車的外表進行裝飾,同時需要提高發動機的效能。這些操作通過裝飾模式就能很好地解決問題。最終得到如所示的個性汽車。
三、裝飾模式分析(Analysis)1、裝飾模式結構
Component定義了一個對象介面,可以給這些對象動態地添加職責。
ComcreteComponent定了一個具體的對象,也可以給這個具體的對象添加職責。
Decorator抽象裝飾類,繼承了Component對象介面,從外類擴充Component類的功能,但對於Component來說,是無需知道Decorator的存在。
ConcreteDecoratorA具體的裝飾對象,起到給Component添加職責的功能。
ConcreteDecoratorB具體的裝飾對象,起到給Component添加職責的功能。
2、原始碼
1、對象介面Component.cs |
public abstract class Component { public abstract void Operation(); } |
2、實作類別ConcreteComponent.cs 繼承於Component介面 |
public class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("開始執行具體的對象..."); } } |
3、裝飾抽象類別Decorator.cs 繼承於Component介面 |
public abstract class Decorator : Component { private Component m_Component; public void SetComponent(Component component) { this.m_Component = component; } public override void Operation() { if (m_Component != null) { m_Component.Operation(); } } } |
4、具體的裝飾對象ConcreteDecoratorA.cs 繼承於Decorator抽象類別 |
public class ConcreteDecoratorA : Decorator { private string addedState; public override void Operation() { base.Operation(); addedState = "進行了狀態屬性裝飾。"; Console.WriteLine(addedState); } } |
給對象介面Component添加了狀態屬性addedState |
5、具體的裝飾對象ConcreteDecoratorB.cs 繼承於Decorator抽象類別 |
public class ConcreteDecoratorB : Decorator { public override void Operation() { base.Operation(); AddedBehavior(); } private void AddedBehavior() { Console.WriteLine("進行了操作行為裝飾。"); } } |
給對象介面Component添加了操作行為AddedBehavior() |
5、用戶端代碼 |
static void Main(string[] args) { ConcreteComponent cc = new ConcreteComponent(); ConcreteDecoratorA cda = new ConcreteDecoratorA(); ConcreteDecoratorB cdb = new ConcreteDecoratorB(); cda.SetComponent(cc); cdb.SetComponent(cda); cdb.Operation(); Console.Read(); } |
給對象介面Component添加了操作行為AddedBehavior() |
3、程式運行結果
四.案例分析(Example)
此案例對具體組件TextView進行了Border和ScrollBar的裝飾。使TextView更符合項目需求。
五、總結(Summary)
裝飾模式,給一個對象動態添加額外職責,這些職責需要由使用者決定加入的方式和時機。裝飾模式提供了“隨插即用”的方式,在運行期間決定何時增加何種功能。就增加功能來說,裝飾模式比產生子類更加靈活。