原理:
裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能酌泰,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式, 它是作為現(xiàn)有的類(lèi)的一個(gè)包裝危融。這種模式創(chuàng)建了一個(gè)裝飾類(lèi),用來(lái)包裝原有的類(lèi)雷袋,并在保持類(lèi)方法簽名完整性的前提下吉殃,提供了額外的功能。
意圖:
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)楷怒。就增加功能來(lái)說(shuō)蛋勺,裝飾器模式相比生成子類(lèi)更為靈活。
主要解決:
一般的鸠删,我們?yōu)榱藬U(kuò)展一個(gè)類(lèi)經(jīng)常使用繼承方式實(shí)現(xiàn)抱完,由于繼承為類(lèi)引入靜態(tài)特征,并且隨著擴(kuò)展功能的增多刃泡,子類(lèi)會(huì)很膨脹巧娱。
注意:
如果只有一個(gè)ConcreteComponent類(lèi),而沒(méi)有抽象的Component類(lèi)烘贴,那么Decorator類(lèi)可以是ConcreteComponent的一個(gè)子類(lèi) 同理禁添,如果只有一個(gè)ConcreteDecorator類(lèi),那么就沒(méi)有必要建立一個(gè)單獨(dú)的Decorator類(lèi)桨踪,而可以把Decorator和ConcreteDecorator的責(zé)任合并成一個(gè)類(lèi)
應(yīng)用實(shí)例:
1老翘、孫悟空有 72 變,當(dāng)他變成"廟宇"后锻离,他的根本還是一只猴子铺峭,但是他又有了廟宇的功能。 2纳账、不論一幅畫(huà)有沒(méi)有畫(huà)框都可以?huà)煸趬ι瞎滢保峭ǔ6际怯挟?huà)框的,并且實(shí)際上是畫(huà)框被掛在墻上疏虫。在掛在墻上之前永罚,畫(huà)可以被蒙上玻璃,裝到框子里卧秘;這時(shí)畫(huà)呢袱、玻璃和畫(huà)框形成了一個(gè)物體。
代碼
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();
//裝飾過(guò)程
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類(lèi)
abstract class Component
{
public abstract void Operation();
}
//ConcreteComponent
class ConcreteComponent : Component
{
public override void Operation()
{
Console.Write("具體對(duì)象的操作 ");
}
}
//Decorator 類(lèi)
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類(lèi)
class ConcreteDecoratorA : Decorator
{
private string addedState;//本類(lèi)的獨(dú)有功能翅敌,以區(qū)別于ConcreteDecoratorB類(lèi)
public override void Operation()
{
//首先執(zhí)行本類(lèi)的功能羞福,如addedState,再運(yùn)行原Component的Operation(),相當(dāng)于對(duì)原Component進(jìn)行了裝飾
addedState = "New State";
Console.Write("具體裝飾對(duì)象A的操作 ");
base.Operation();
}
}
//ConcreteDecoratorB類(lèi)
class ConcreteDecoratorB : Decorator
{
private void AddedBehavior()//本類(lèi)的獨(dú)有功能,以區(qū)別于ConcreteDecoratorA類(lèi)
{
}
public override void Operation()
{
//首先執(zhí)行本類(lèi)的功能蚯涮,AddedBehavior(),再運(yùn)行原Component的Operation(),相當(dāng)于對(duì)原Component進(jìn)行了裝飾
AddedBehavior();
Console.Write("具體裝飾對(duì)象B的操作 ");
base.Operation();
}
}
}