装饰模式把每个要装饰的功能放在单独的类中, 并让这个类包装他所要装饰的对象. 因此, 当需要执行特殊行为时, 客户代码可以在运行时根据需要有选择地按顺序地使用装饰功能包装对象了.
服饰装扮代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DecorateMode
{
class Program
{
static void Main(string[] args)
{
Person p = new Person("小明");
Sneakers sk = new Sneakers();
BigTrouser bt = new BigTrouser();
TShirts ts = new TShirts();
sk.Decorate(p);
sk.Show();
bt.Decorate(sk);
bt.Show();
ts.Decorate(bt);
ts.Show();
}
}
// person virtual
class Person
{
public Person()
{}
private string name;
public Person(string name)
{
this.name = name;
}
// 注意是virtual. 子类可以重写也可以不重写. Person可以实例化.
public virtual void Show()
{
Console.WriteLine(" 装扮的{0}", name);
}
}
// 服饰
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.Write(" T-Shirt ");
base.Show();
}
}
class BigTrouser : Finery
{
public override void Show()
{
Console.Write(" big trousers ");
base.Show();
}
}
class Sneakers : Finery
{
public override void Show()
{
Console.Write(" Sneakers ");
base.Show();
}
}
class LeatherShoes : Finery
{
public override void Show()
{
Console.Write("LeatherShoes");
base.Show();
}
}
class Tie : Finery
{
public override void Show()
{
Console.Write("Tie");
base.Show();
}
}
class Suit : Finery
{
public override void Show()
{
Console.Write("Suit");
base.Show();
}
}
}
输出结果:
**装饰类对象Finery里面有一个父类Person对象component.
父类show是virtual. 可以实现多态.
所以. Finery的子类可以将其他Finery的子类包装在自己的component中.
这样循环嵌套, 就可以实现按照一定顺序添加功能的目的.**