//Component是定义一个对象接口,可以给这些对象动态的添加职责
abstract class Component
{
public abstract void Operation();
}
//定义了一个具体的对象,也可以给这个对象添加一些职责
class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("具体对象的操作!");
}
}
以下两个就是具体的装饰对象,起到给Component添加职责的功能。//装饰抽象类,集成了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的
class Decorator : Component
{
protected Component component;
public void SetComponent(Component comp) //设置Component
{
component = comp;
}
public override void Operation() //重写方法,实际执行时调用的是component的Operation方法
{
if (component != null)
component.Operation();
}
}
class ConcreteDecoratorA : Decorator
{
private string addedState; //本类独有的扩展功能,以区别与ConcreteDecoratorB
public override void Operation()
{
base.Operation(); //首先运行Component的Operation(),再执行本类的功能,如addedState,相当于对原Component进行了装饰
addedState = "New State A";
Console.WriteLine("具体装饰对象A的操作:" + addedState);
}
}
如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类;同样的道理,如果只有一个ConcreteDecorator类,那么就没必要简历一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
AddB();
Console.WriteLine("具体装饰对象B的操作");
}
public void AddB() //本类独有的方法
{
Console.WriteLine("执行AddB方法");
}
}//客户端方法
class MainProgram
{
void Main()
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA ca = new ConcreteDecoratorA();
ConcreteDecoratorB cb = new ConcreteDecoratorB();
//装饰模式是利用SetComponent来对对象进行包装的,//这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关系如何被添加到对象链当中。
ca.SetComponent(c);
cb.SetComponent(ca);
cb.Operation();
Console.ReadKey();
}
}
//人的类
class Person
{
public Person() { }
private string Name;
public Person(string name)
{
Name = name;
}
public virtual void Show()
{
Console.WriteLine("装扮的{0}", Name);
}
}
//服饰类,继承自Person,因为要对人进行装扮
class Finery : Person
{
protected Person person;
//打扮方法,要打扮的人物
public void Decorate(Person per)
{
person = per;
}
public override void Show()
{
if (person != null)
{
person.Show();
}
}
}
//具体服饰类——鞋子
class Sneakers : Finery
{
public override void Show()
{
Console.Write(" 破球鞋 ");
base.Show();
}
}
当然还可以继续扩展服饰类,此处我只写上面两个了……//具体服饰类——T恤
class TShirts : Finery
{
public override void Show()
{
Console.Write(" 大T恤 ");
base.Show();
}
}
最后输出结果为://客户端代码
class Program
{
static void Main(string[] args)
{
Person person = new Person("伟哥");
Console.WriteLine("装扮样式:");
Sneakers pqx = new Sneakers(); //破球鞋
TShirts tx = new TShirts(); //T恤衫
pqx.Decorate(person); //先用破球鞋装扮
tx.Decorate(pqx); //再用T恤衫装扮
tx.Show(); //展示................草泥马的样子
Console.ReadKey();
}
}