装饰者模式——HeaderFirst学习笔记

1 装饰者模式定义

动态的将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另外一种选择。

2 装饰者模式精髓

2.1对扩展开放,对修改关闭

2.2继承属于扩展形式之一,但不见得是达到弹性设计的最佳方案

2.3设计应该允许行为被扩展而无需修改现有代码

2.4装饰者意味着一群装饰者类,这些类用来包装具体的组件

2.5装饰者和被装饰者具备同样的类型

2.6装饰者对组件的客户是透明的,除非客户程序依赖组件具体类型

2.7装饰者会产生很多小对象,运用过度会使得程序复杂

3 例子代码

namespace DecoratorDesignPattern
{

    public interface  Deverage
    {

         string getDescription();

         double cost();
    }

    public abstract class ConditionDecorator : Deverage
    {
        public virtual string getDescription() 
        { 
            return string.Empty;
        }

        public virtual double cost()
        {
            return 0.0;
        }
    }

    public class HouseBlend : Deverage
    {

        public HouseBlend(string description)
        {
            m_description = description;
        }

        private string m_description;

        #region Deverage 成员

        public string getDescription()
        {
            return m_description;
        }

        public double cost()
        {
            return 100;
        }

        #endregion
    }

    public class DarkRoast : Deverage
    {

        public DarkRoast(string description)
        {
            m_description = description;
        }

        private string m_description;

        #region Deverage 成员

        public string getDescription()
        {
            return m_description;
        }

        public double cost()
        {
            return 200;
        }

        #endregion
    }

    public class Decaf : Deverage
    {

        public Decaf(string description)
        {
            m_description = description;
        }

        private string m_description;

        #region Deverage 成员

        public string getDescription()
        {
            return "Decaf";
        }

        public double cost()
        {
            return 300;
        }

        #endregion
    }

    public class Espresso : Deverage
    {

        public Espresso(string description)
        {
            m_description = description;
        }

        private string m_description;

        #region Deverage 成员

        public string getDescription()
        {
            return "Espresso";
        }

        public double cost()
        {
            return 400;
        }

        #endregion
    }


    public class Moca : ConditionDecorator
    {
        private Deverage m_Deverage;

        public Moca(Deverage deverage)
        {
            m_Deverage = deverage;
        }

        #region Deverage 成员

        public override string getDescription()
        {
            return m_Deverage.getDescription()+",Moca";
        }

        public override double cost()
        {
            return m_Deverage.cost()+20;
        }

        #endregion
    }

    public class Soy : ConditionDecorator
    {
        private Deverage m_Deverage;

        public Soy(Deverage deverage)
        {
            m_Deverage = deverage;
        }

        #region Deverage 成员

        public override string getDescription()
        {
            return m_Deverage.getDescription() + ",Soy";
        }

        public override double cost()
        {
            return m_Deverage.cost() + 30;
        }

        #endregion
    }

    public class Whip : ConditionDecorator
    {
        private Deverage m_Deverage;

        public Whip(Deverage deverage)
        {
            m_Deverage = deverage;
        }

        #region Deverage 成员

        public override string getDescription()
        {
            return m_Deverage.getDescription() + ",Whip";
        }

        public override double cost()
        {
            return m_Deverage.cost() + 40;
        }

        #endregion
    }
}

namespace DecoratorDesignPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Deverage pCoffee = new HouseBlend("深焙咖啡");

            Deverage pCondiment = new Moca(pCoffee);
            pCondiment = new Soy(pCondiment);
            pCondiment = new Whip(pCondiment);

            Console.WriteLine("咖啡名字为:" + pCondiment.getDescription());
            Console.WriteLine("咖啡价格为:" + pCondiment.cost().ToString());
        }
    }
}


4 设计类图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值