zoukankan      html  css  js  c++  java
  • 极速理解设计模式系列: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 下载。

  • 相关阅读:
    Linux:PS命令详解与使用
    linux日志守护进程 syslog
    Linux shell 判断字符串为空等常用命令
    Java 中zookeeper操作
    mysql数据库读写分离,主从同步实现方法
    【转】几种Java序列化方式的实现
    如何为SUSE配置IP地址,网关和DNS
    linux中export的作用
    91家纺网,多线程版本待处理
    91家纺网爬虫,不包含多线程登录处理,第三张表格数据没有对接
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2291750.html
Copyright © 2011-2022 走看看