引入装饰模式的目的
当我们进行某项工作时,需要进行不同事务或者功能之间的搭配,这些搭配会出现各种组合,而每个组合都要对应一个类,的时候我们就应该考虑应用装饰模型。
装饰模式的主要功能
有效的将类的核心职责和装饰功能区分开,而且去除相关中重复的装饰逻辑
对装饰模型中各个类功能的分析
装饰模型可以说是给特定的对象以特定的职能、特点、或者功能的的模式。
请看下面的UML图:
从上图中可以看到装饰模型中有三个主要的类:分别是Component、ConcreteComponent和Decorator;
这三个类中Component是一个接口,它的功能就是连接ConcreteComponent和Decorator。让Decorator类下的具体功能通过Component这个借口装备到ConcreteComponent这个具体的实例上
这就像我们电脑的主板和主板上的插件,我们的主板(ConcreteComponent)通过特定的插口(Component)装上特定的插件(Decorator)来完善或者提高电脑的性能。
下面我就演示一个例子,这个例子以人的打扮为例
第一步写接口
//写一个人类的接口,用来连接实例人还有装扮
class Person
{
public Person ()
{ }
private string _name;
public Person (string name)
{
this._name = name;
}
public virtual void show()
{
Console.WriteLine("装扮的{0}",_name);
}
}
第二步实例化一个人
class PersonXiaoMing : Person
{
//string name = "";
public PersonXiaoMing (string name):base(name)
{
//this.name = name;
}
public override void show()
{
//Console.WriteLine("装扮的{0}", name);
base.show();
}
}
第三步添加装扮类
class Finery : Person
{
protected Person component;
public void Decorate(Person component)
{
this.component = component;
}
public override void show()
{
if(component !=null)
{
component.show();
}
}
}
第四步添加装扮的子类,也就是装扮的物件
class Tshirts:Finery
{
public override void show()
{
Console.WriteLine("大T恤");
base.show();
}
}
class BigTrouser : Finery
{
public override void show()
{
Console.WriteLine("垮裤");
base.show();
}
}
第五步客户端代码
Person xm = new PersonXiaoMing("小明");
Tshirts ts = new Tshirts();
BigTrouser bt = new BigTrouser();
ts.Decorate(xm);
bt.Decorate(ts);
bt.show();
Console.Read();
客户端代码图解
首先实例化了三个类。这就不讲解了。
随后,ts调用Decorate方法,参数是xm实例;
代码实例化之后,调用方法分别对自身的字段进行了赋值。
最后bt调用show方法,显示“垮裤”,调用父类中的show方法,然后调用bt实例中的show方法,bt实例中的component=ts。
然后调用ts的show方法,显示“大T恤”,调用父类的show方法,然后调用ts实例中的show方法,ts实例中的component=xm。
然后调用xm的show方法,因为name为“小明”,所以显示“装扮的小明”