极速理解设计模式系列:23.装饰器模式(Decorator Pattern)

五个角色:部件(Component)、具体部件(ConcreteComponent)、装饰抽象类(Decorator)、具体装饰对象(ConcreteDecorator)、客户端(Client) 

        部件(Component):定义对象的接口,可以给对象动态增加职责。

        具体部件(ConcreteComponent):实现对象。

        装饰抽象类(Decorator):维护一个部件的实例,并且提供一个和部件相同的接口以使用。

        具体装饰对象(ConcreteDecorator):实现装饰效果,增加职责。

        客户端(Client):使用装饰包围部件,让部件增加功能。

实现思路:根据部件的需要动态的为部件增加职责功能。

类图: 

应用场景:做四川菜,做广东菜。

分析:在本实例中设置做四川菜还需要一个汤,一盘水果,做广东菜的时候需要一个汤还需要蘸酱,不需要水果。

        下面我们在控制台程序去演示一下如何使用Decorator Pattern:

        一、部件(Component)

    //部件(Component)
public abstract class Cooking
{
public abstract void Cook();
}

        二、具体部件(ConcreteComponent)

    //具体部件(ConcreteComponent)
public class SichuanFood : Cooking
{
public override void Cook()
{
Console.WriteLine("炒川菜");
}
}

//具体部件(ConcreteComponent)
public class GuangdongFood : Cooking
{
public override void Cook()
{
Console.WriteLine("炒广东菜");
}
}

        三、装饰抽象类(Decorator)

    //装饰抽象类(Decorator)
abstract class Decorator : Cooking
{
protected Cooking cooking;
public Decorator(Cooking cook)
{
this.cooking = cook;
}
public override void Cook()
{
cooking.Cook();
}
}

        四、具体装饰对象(ConcreteDecorator)

    //具体装饰对象(ConcreteDecorator)
class Soup : Decorator
{
public Soup(Cooking cook):base(cook)
{

}
public override void Cook()
{
base.Cook();
Console.WriteLine("加做一个汤");
}
}

//具体装饰对象(ConcreteDecorator)
class Fruit : Decorator
{
public Fruit(Cooking cook)
: base(cook)
{

}
public override void Cook()
{
base.Cook();
Console.WriteLine("再加一盘水果");
}
}

//具体装饰对象(ConcreteDecorator)
class Sauce : Decorator
{
public Sauce(Cooking cook)
: base(cook)
{

}
public override void Cook()
{
base.Cook();
Console.WriteLine("再加一碟酱汁");
}
}

        五、客户端(Client)

    //客户端(Client)
class Program
{
static void Main(string[] args)
{
Cooking sichuan = new SichuanFood();
Decorator corator = new Soup(sichuan);
Decorator fruit = new Fruit(corator);
fruit.Cook();

Console.WriteLine("-----------------------------");
Cooking guangdong = new GuangdongFood();
Decorator soup = new Soup(guangdong);
Decorator sauce = new Sauce(soup);
sauce.Cook();

Console.ReadLine();
}
}

       如需源码请点击 DecoratorPattern.rar 下载。

posted @ 2011-12-22 10:22  .NET架构  阅读(2333)  评论(0编辑  收藏  举报