设计模式分为三大类型,一创建型,二结构型,三行为型.
而装饰者(decorator)模式是属于结构型的一种.
此模式主要的适应情况是:需要多种情况组合出现时.
也就是调用一个方法的时候,可能是ABC三个中的一种,也可能是他们的组合.
AB,AC,BC,AC等等.
如果听到类似的情形,需要组合多种情况出现的时候,就需要考虑到使用此种模式了.
这个模式顾名思义:就是装饰,一个本体可以有多种装饰物,多个装饰物用来修饰一个本体.
下面我们来举个小例子来加深下了解:
大致情况是:一家人在吃饭,小明的碗里只有白米饭,小明没有夹菜一直在吃白饭,爷爷看不下去了,
就给他夹了一块肉,妈妈也看不下去了,就给他夹了一块鱼,这个时候爸爸也看不下去了,光吃荤菜不行,
要荤素搭配呀,于是就给他夹了一根青菜.
在这个案例里,小明是一直没夹菜的,只顾自己吃饭.给他夹菜的是爸爸妈妈和爷爷.而这个夹菜的组合是
不固定的,可能都给他夹,也可能只有任何几个人夹菜,这样就动态给他增加了功能.
相关代码如下:
class="brush:csharp;gutter:false;"> public interface IEat { void Eat(); } public class XiaoMing:IEat { public void Eat() { Console.WriteLine("小明只吃白米饭"); } } public class EatDecorator:IEat { private IEat _eat; public EatDecorator(IEat eat) { this._eat = eat; } public virtual void Eat() { if (_eat != null) { _eat.Eat(); } } } public class MotherDecorator : EatDecorator { public MotherDecorator(IEat eat) : base(eat) { } public override void Eat() { Console.WriteLine("妈妈给夹了一块鱼"); base.Eat(); } }
调用代码如下:
static void Main(string[] args) { IEat xiaoming = new XiaoMing(); IEat mom = new MotherDecorator(xiaoming); IEat dad = new FatherDecorator(mom); IEat grandpa = new GrandfatherDecorator(dad); grandpa.Eat(); }
运行结果如下:
此模式的精要在于: