原理:
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式, 它是作爲現有的類的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
意圖:
動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。
主要解決:
一般的,我們爲了擴展一個類經常使用繼承方式實現,由於繼承爲類引入靜態特徵,並且隨着擴展功能的增多,子類會很膨脹。
注意:
如果只有一個ConcreteComponent類,而沒有抽象的Component類,那麼Decorator類可以是ConcreteComponent的一個子類 同理,如果只有一個ConcreteDecorator類,那麼就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合併成一個類
應用實例:
1、孫悟空有 72 變,當他變成"廟宇"後,他的根本還是一隻猴子,但是他又有了廟宇的功能。 2、不論一幅畫有沒有畫框都可以掛在牆上,但是通常都是有畫框的,並且實際上是畫框被掛在牆上。在掛在牆上之前,畫可以被蒙上玻璃,裝到框子裏;這時畫、玻璃和畫框形成了一個物體。
代碼
Prpgram.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 裝飾模式
{
class Program
{
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();
//裝飾過程
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();
Console.ReadKey();
}
}
}
Decorator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 裝飾模式
{
//Component類
abstract class Component
{
public abstract void Operation();
}
//ConcreteComponent
class ConcreteComponent : Component
{
public override void Operation()
{
Console.Write("具體對象的操作 ");
}
}
//Decorator 類
abstract class Decorator : Component
{
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Operation()
{
if (component != null) {
component.Operation();
}
}
}
//ConcreteDecoratorA類
class ConcreteDecoratorA : Decorator
{
private string addedState;//本類的獨有功能,以區別於ConcreteDecoratorB類
public override void Operation()
{
//首先執行本類的功能,如addedState,再運行原Component的Operation(),相當於對原Component進行了裝飾
addedState = "New State";
Console.Write("具體裝飾對象A的操作 ");
base.Operation();
}
}
//ConcreteDecoratorB類
class ConcreteDecoratorB : Decorator
{
private void AddedBehavior()//本類的獨有功能,以區別於ConcreteDecoratorA類
{
}
public override void Operation()
{
//首先執行本類的功能,AddedBehavior(),再運行原Component的Operation(),相當於對原Component進行了裝飾
AddedBehavior();
Console.Write("具體裝飾對象B的操作 ");
base.Operation();
}
}
}
參考
參考書籍:《大話設計模式》
參考鏈接: 菜鳥教程.