前言:
装饰模式:动态给对象添加一些额外的职责。
结构图
角色
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(); }
结果
