问题描述
使用程序给人搭配不同的服饰,预期的输出结果如下:
第一种装扮:
大T恤 垮裤 破球鞋 装扮的小菜
第二种装扮:
西装 领带 皮鞋 装扮的小菜
第三种装扮:
领带 垮裤 皮鞋 破球鞋 装扮的小菜
代码实现
定义Person类
public class Person
{
public Person() { }
private string mName;
public Person(string _name)
{
this.mName = _name;
}
public virtual void Show()
{
Console.WriteLine("装扮的" + mName);
}
}
定义Finery类
class Finery : Person
{
protected Person mComponent = null;
public void decorate(Person component)
{
mComponent = component;
}
public override void Show()
{
if (mComponent != null)
{
mComponent.Show();
}
}
}
具体的服饰类
class TShirts :Finery
{
public override void Show()
{
Console.WriteLine("大T恤");
base.Show();
}
}
class Sneakers : Finery
{
public override void Show()
{
Console.WriteLine("运动鞋");
base.Show();
}
}
class BigTouser:Finery
{
public override void Show()
{
Console.WriteLine("垮裤");
base.Show();
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
Person person = new Person("小菜");
Console.WriteLine("第一种装扮");
Sneakers sneakers = new Sneakers();
BigTouser bigTouser = new BigTouser();
TShirts shirts = new TShirts();
sneakers.decorate(person);
bigTouser.decorate(sneakers);
shirts.decorate(bigTouser);
shirts.Show();
}
}
运行结果:
第一种装扮
大T恤
垮裤
运动鞋
装扮的小菜
结构组成
装饰模式主要有四类角色组成
实体接口:对象接口的定义,可以为对象动态添加职责
实体类:这个例子中具体为Person类
装饰抽象类:继承实体接口,动态扩展职责,这个粒子中具体为服饰抽象类
具体装饰类:装饰的具体表现