装饰模式(Decorator):
一、定义
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
二、模式原理
当需要对一个类进行扩展时,一般使用继承的方式,添加子类继承实现,耦合度较高。
改成组合的方式,添加装饰子类,每个子类实现不同的装饰效果,使得组合更加灵活。
三、优缺点
优点:利用组合的方式,可以组合出不同的装饰效果,改变装饰的顺序,可以有更多的搭配效果。
缺点:多个装饰子类,过度使用会变得复杂。
四、使用场景
一个类需要被扩展,并且这种扩展是多变的,会根据需求的不同增加或删除,或者扩展执行顺序也会改变。使用类继承的方式不好操作,这个时候可以利用装饰模式,将操作动作抽象,具体实现每个操作,灵活地组合。
五、实现例子
小明穿衣服,多种搭配,并且可以选择不穿,或者乱搭风。
public abstract class Component
{
public abstract void Wear();
}
//具体构件
public class XiaoMing : Component
{
public override void Wear()
{
Console.WriteLine("先穿上内裤");
}
}
//抽象装饰
public class Hand : Component
{
private Component hand;
//传入具体被装饰的对象
public Hand(Component people)
{
hand = people;
}
public override void Wear()
{
hand.Wear();
}
}
//具体装饰 穿长裤
public class XiaoMingsHand : Hand
{
public XiaoMingsHand(Component people) : base(people)
{
}
public override void Wear()
{
base.Wear();
Console.WriteLine("穿上长裤");
}
}
//具体装饰 穿T恤
public class XiaoMingsHand2 : Hand
{
public XiaoMingsHand2(Component people) : base(people)
{
}
public override void Wear()
{
base.Wear();
Console.WriteLine("穿上T恤");
}
}
static void TestDecorator()
{
XiaoMing xiaoMing = new XiaoMing();
XiaoMingsHand xiaoMingsHand = new XiaoMingsHand(xiaoMing);
XiaoMingsHand2 xiaoMingsHand2 = new XiaoMingsHand2(xiaoMingsHand);
xiaoMingsHand2.Wear();
}
关键在于装饰类构造函数,将主体传入,实现时,实现基类函数。
//如果要先穿T恤,再穿长裤,改变一下装饰类的顺序
static void TestDecorator()
{
XiaoMing xiaoMing = new XiaoMing();
XiaoMingsHand2 xiaoMingsHand2 = new XiaoMingsHand2(xiaoMing);
XiaoMingsHand xiaoMingsHand = new XiaoMingsHand(xiaoMingsHand2);
xiaoMingsHand.Wear();
}
//如果只穿内裤,或者穿上T恤,只需要把不需要的装饰类去掉即可。
static void TestDecorator()
{
XiaoMing xiaoMing = new XiaoMing();
xiaoMing.Wear();
}
可以看到装饰模式在这种需求多变,组合不同的场景下使用非常灵活~~