前言:
装饰模式:动态给对象添加一些额外的职责。
结构图
角色
Componet(抽象构件角色)
定义一个抽象接口,为对象添加职责
abstract class Component
{
public abstract void Operation();
}
ConcreteComponent(具体构件角色)
抽象构件角色:定义一个抽象接口,来规范准备附加功能的类
class ConcreteComponent : Component
{
public override void Operation ()
{
console.writeline("具体对象操作");
}
}
Decorator( 抽象装饰者角色)
定义与抽象构件角色相同的接口。实际上执行的还是抽象构件角色的方法。
abstract class Decorator:Component
{
protected Component component;
public void Setcomponent (Component component ) //构造函数对属性赋值
{
this.component=component;
}
public override void Operation()
{
if (component ! =null)
{
component.Operation();
}
}
}
ConcreteDecoratorA (具体装饰者角色)
实现装饰者角色,添加额外功能
class ConcreteDeratorA:Decorator
{
private string addedState;
public override void Operation()
{
base.Operation();
addstate="new state";
console.writeline("具体装饰对象A的操作");
}
}
Demo (来自《大话设计模式.程杰》)
“小菜扮靓”
ConcreteComponent
//person类。concrete component
class Person
{
public Person() //空的构造函数为后面声明一个变量铺垫
{ }
private string name;
public Person(string name) //带有参数的构造函数为类的属性进行赋值
{
this.name = name;
}
public virtual void show() //显示“装扮”方法
{
Console.WriteLine("装扮的{0}",name ); //{0}参数化的占位符,显示变量name的内容
}
}
Decorator
class Finery : Person
{
protected Person component;
//通过属性赋值的方式给给定的类进行装扮
public void Decorate(Person component) //后面不断调用对象的Decorator方法对对象进行有顺序的赋值
{
this.component = component;
}
public override void show() //基类的方法显示装饰内容
{
if (component != null)
{
component.show();
}
}
}
ConcreteDecorator
//具体的服饰类
class Tshirts : Finery
{
public override void show() //实际上是person类的方法执行
{
Console.WriteLine ("大T衬衣");
base.show(); //实际上是person类的show方法
}
}
class BigTrouser : Finery
{
public override void show()
{
Console.WriteLine ("大垮裤");
base.show();
}
}
}
客户端
static void Main(string[] args)
{
Person chen = new Person("小菜");
Console.WriteLine("第一种装扮");
Tshirts aa = new Tshirts(); //Tshirts类是继承Finery。而Finery拥有Decorate方法
BigTrouser bb = new BigTrouser();
aa.Decorate(chen); //对象调用Decorate方法对对象进行有顺序装饰
bb.Decorate(aa );
bb.show();
}
结果