【装饰模式】:
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
Component是定义一个对象接口,可以给这些对象动态的添加职责。
ConcreteComponent是定义一个具体的对象,也可以给这个对象添加一些职责。
Decorator装饰抽象类,继承了Component类,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator类的存在的。至于ConcreteDecorator
就是具体的装饰对象,起到给Component添加职责的功能。
【优点】:把类中的装饰功能从类中搬移到类外,这样可以简化原有的类;能有效的把核心职责和装饰功能区分开,而且可以除去相关类中重复的逻辑。
【示例代码】
using System;
//Component是定义一个对象接口,可以给这些对象动态的添加职责。
abstract class Componet
{
public abstract void Operation();
}
// 具体要操作的对象,实现上面的Componet接口,将要添加的职责移到类外。
class ConcreteComponent : Componet
{
public override void Operation()
{
Console.WriteLine("具体对象的操作");
}
}
// 装饰类基类,也实现Componet接口。并保存一个Componet类的引用。
// 相当于是两次继承。
abstract class Decorator : Componet
{
protected Componet component;
public void SetComponent(Componet component)
{
this.component = component;
}
public override void Operation()
{
if (component != null)
{
//重写Operation(),实际执行的是Component雷的Operation();
component.Operation();
}
}
}
//进行A装饰;
class ConcreteDecoratorA : Decorator
{
private string addedState;
public override void Operation()
{
//先完成本来要进行的操作;
base.Operation();
addedState="new State";
Console.WriteLine("对具体对象进行“A装饰”的操作");
}
}
//进行B装饰;
class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddedBehavior();
Console.WriteLine("对具体对象进行“B装饰”的操作");
}
private void AddedBehavior()
{ }
}
///////////////////////////////////////////////////////////////////////////////
/*客户端代码*/
class APP
{
static void Main()
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
d1.SetComponent(c);//对c进行A装饰;
d2.SetComponent(d1);//对d1进行B装饰;
d2.Operation();
Console.Read();
}
}
例子:以人的装扮为例。
【代码实现】
using System;
//Person类
class Person
{
public Person(){}
private string name;
public Person(string name)
{
this.name=name;
}
public virtual void Show()
{
Console.WriteLine("装扮的{0}",name);
}
}
//服饰类:继承自Person,并维护一个Person的引用。
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()
{
base.Show();
Console.WriteLine("T恤衫");
}
}
class Sneakers:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("胶底运动鞋");
}
}
class Trousers:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("短裤");
}
}
class LeatherShoes:Finery
{
public override void Show()
{
base.Show();
Console.WriteLine("皮鞋");
}
}
//客户代码
class App
{
static void Main()
{
Person xs=new Person("小山");
Console.WriteLine("第一种装扮");
Sneakers sk=new Sneakers();
Trousers ts=new Trousers();
TShirts tst=new TShirts();
sk.Decorate(xs);
ts.Decorate(sk);
tst.Decorate(ts);
tst.Show();
}
}