參考:https://www.cnblogs.com/frank0812/p/11281105.html
1.什麼是裝飾器模式
2.裝飾器模式有什麼優勢
3.怎麼用裝飾器模式
定義:裝飾者顧名思義就是對一個類添加一些額外的裝飾(功能)。我們想給一個對象添加一些額外的功能又不改變對象內方法的簽名怎麼做呢?最常用的方法就是繼承了,子類繼承父類,然後重寫父類的方法。考慮一種情況,如我們要給父類中的Show方法添加三個新功能功能a、功能b、功能c,這三種功能組合在一起時數目和執行順序不同,效果也是不同的,爲了現實所有的功能,我們需要創建很多子類,如子類1的show方法:BaseShow+功能a,子類2的show方法:BaseShow+ab,子類3的show方法:BaseShow+abc,子類4的show方法:BaseShow+ba.....子類n的show方法:BaseShow+功能cba(BaseShow指的是父類原本的show方法),如果添加的功能組合太多使用繼承會造成子類爆炸。裝飾器模式可以很好地解決這個問題。(舉個例子:給主功能加裝飾,例如你是一個裸裝法師,你要三個槽,衣服,鞋子,帽子,若要列出則你需要8個子類(2*2*2),若使用裝飾器模式,則只需要3個裝飾器實現具體類就行)
代碼如下:
using System;
namespace DecoratorModel
{
//抽象類
public abstract class BaseDecorator
{
public abstract void Show();
}
//裸裝法師
public class SinglePerson : BaseDecorator
{
public override void Show()
{
Console.WriteLine("這是一個法師");
}
}
//裝飾器類
public class Decorator : BaseDecorator
{
public BaseDecorator decorator = null;
public Decorator(BaseDecorator baseDecorator)
{
this.decorator = baseDecorator;
}
public override void Show()
{
this.decorator.Show();
}
}
//具體實現裝飾器類
public class SinglePersonWithShoes : Decorator
{
public SinglePersonWithShoes(BaseDecorator decorator):base(decorator)
{
this.decorator = decorator;
}
public override void Show()
{
base.Show();
Console.WriteLine("穿一雙鞋子");
}
}
//具體實現裝飾器類
public class SinglePersonWithHit : Decorator
{
public SinglePersonWithHit(BaseDecorator decorator) : base(decorator)
{
this.decorator = decorator;
}
public override void Show()
{
base.Show();
Console.WriteLine("戴個帽子");
}
}
class Program
{
static void Main(string[] args)
{
BaseDecorator person = new SinglePerson();
person = new SinglePersonWithShoes(person);
person = new SinglePersonWithHit(person);
person.Show();
Console.ReadLine();
}
}
}
裝飾者模式的使用場景:
當我們需要動態添加類的功能同時不改變類的結構時可以使用裝飾者模式,裝飾類本質是一個現有類的包裝。
裝飾者模式的優點:
1.一個類需要添加一些功能,而這些功能按數目、順序組合形成的效果不一樣,如果用繼承會造成子類過多,裝飾者模式可以很好地解決這個問題;
2.使用裝飾者模式我們可以動態的添加/刪除類的功能,靈活性好。
裝飾者模式的缺點:
多層裝飾比較複雜,我們需要注意裝飾順序等因素。如先穿內褲再穿褲子,是正常人;而先穿褲子再穿內褲就是超人了。在開發中先過濾字符串再加密,和先加密字符串再過濾的效果是完全不同的。