簡介
裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許你在不改變對象接口的前提下,動態(tài)地將新行為附加到對象上。這種模式是通過創(chuàng)建一個包裝(或裝飾)對象,將要被裝飾的對象包裹起來,從而實現(xiàn)對原有對象功能的增強和擴展。
角色
- Component(組件): 定義了一個抽象接口,可以是抽象類或接口,規(guī)定了被裝飾對象和裝飾器的共同接口。
- ConcreteComponent(具體組件): 實現(xiàn)了組件接口的具體類,是被裝飾的對象。
- Decorator(裝飾器): 也是組件接口的子類,它持有一個指向具體組件對象的引用,并可以附加新的行為。
- ConcreteDecorator(具體裝飾器): 實現(xiàn)了裝飾器接口的具體類,負責為具體組件對象添加新的行為。
優(yōu)點
- 裝飾器模式可以在不改變現(xiàn)有代碼的情況下,動態(tài)地擴展一個對象的功能。
- 可以使用多個裝飾器來組合成一個對象,可以靈活地增強對象的功能。
- 裝飾器模式遵循開閉原則,可以通過新增裝飾器來擴展功能,而無需修改已有代碼。
缺點
- 過度的使用裝飾器模式會導致程序中出現(xiàn)大量的小類,可能會使程序結構變得復雜。
- 如果過度地使用繼承來實現(xiàn)裝飾器模式,可能會導致設計失去靈活性和可復用性。
應用場景
- 動態(tài)擴展功能: 當你需要在不修改現(xiàn)有對象的代碼的情況下,動態(tài)地向?qū)ο筇砑有鹿δ芑蛐袨闀r,裝飾者模式是一種非常有用的設計模式。
- 避免類爆炸: 當有多個可能的組合方式時,避免創(chuàng)建大量子類的類層次結構,而使用裝飾者模式可以更靈活地組合不同的功能,避免類爆炸問題。
- 組合優(yōu)于繼承: 裝飾者模式提供了一種更靈活的方式來組合對象的行為,相對于靜態(tài)的繼承,它更加優(yōu)雅且易于維護。
- 在運行時動態(tài)添加行為: 當需要在運行時決定對象是否添加某些行為,以及如何添加這些行為時,裝飾者模式可以派上用場。
- 分層次的配置: 裝飾者模式允許你將各種功能按照層次結構進行組織和配置,從而更容易管理復雜的對象。
- 可插拔性: 當你希望能夠隨時插入或刪除功能時,裝飾者模式允許你以靈活的方式添加或刪除裝飾器,從而實現(xiàn)可插拔性。
- 不影響現(xiàn)有代碼: 裝飾者模式不需要修改現(xiàn)有對象的代碼,因此適用于已經(jīng)存在的類,無需改變其結構即可擴展功能。
實現(xiàn)
案例:我們工作中經(jīng)常用到流程引擎,我們這次就用裝飾器模式寫一個小案例模擬流程引擎中流程動作的處理,可以做到隨意打亂流程動作的順序,可以隨意增加和減少流程動作。文章來源:http://www.zghlxwxcb.cn/news/detail-845177.html
- Component(組件)
public abstract class AbstractFlowAction
{
public ulong Id { get; set; }
public string Name { get; set; }
public abstract void Excute();
}
- ConcreteComponent(具體組件)
public class FlowActionInfo : AbstractFlowAction
{
public override void Excute()
{
Console.WriteLine($"ID:{this.Id},Name:{this.Name}");
}
}
- Decorator(裝飾器)
/// <summary>
/// 裝飾器
/// </summary>
public abstract class AbstractDecorator : AbstractFlowAction
{
AbstractFlowAction _action = null;
public AbstractDecorator(AbstractFlowAction action)
{
_action = action;
}
public override void Excute()
{
this._action.Excute();
}
}
- ConcreteDecorator(具體裝飾器)
/// <summary>
/// 內(nèi)容檢查
/// </summary>
public class ContentActionDecorator : AbstractDecorator
{
public ContentActionDecorator(AbstractFlowAction action) : base(action)
{
}
public override void Excute()
{
base.Excute();
Console.WriteLine("開始內(nèi)容檢查...");
}
}
/// <summary>
/// 格式檢查
/// </summary>
public class FileFormatActionDecorator : AbstractDecorator
{
public FileFormatActionDecorator(AbstractFlowAction action) : base(action)
{
}
public override void Excute()
{
base.Excute();
Console.WriteLine("開始格式檢查...");
}
}
/// <summary>
/// 殺毒動作
/// </summary>
public class VirusActionDecorator : AbstractDecorator
{
public VirusActionDecorator(AbstractFlowAction action) : base(action)
{
}
public override void Excute()
{
base.Excute();
Console.WriteLine("開始殺毒...");
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-845177.html
到了這里,關于.NET 設計模式—裝飾器模式(Decorator Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!