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

原创 2015年11月18日 22:21:45

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 设计类图


版权声明:本文为博主原创文章,未经博主允许不得转载。

HeaderFirst

策略封装 适配器 迭代器 外观 组合 观察者 模板方法 工厂方法 装饰者 状态
  • fgszdgbzdb
  • fgszdgbzdb
  • 2017年03月08日 22:03
  • 234

简单理解设计模式之装饰者模式

闲话不多说,今天来谈谈装饰者模式: 首先,我觉得要学习设计模式,记住它的定义真的挺重要的,或者一开始的时候你不了解,但是后面理解模式的内涵之后,你会发现定义的精辟。 装饰者模式:动态地将责任附加到...
  • YQYnsmile
  • YQYnsmile
  • 2016年09月26日 21:26
  • 1277

设计模式实战应用之三:装饰者模式

装饰者模式的定义        装饰者模式是应用最普遍的设计模式之一。伟大的 Java 缔造者们将设计模式的应用发挥到了极致,作为解释型语言的 Java 从诞生到今天始终能够作为最主流与应用最广泛的语...
  • defonds
  • defonds
  • 2014年01月03日 21:17
  • 6922

设计模式 装饰者模式 带你重回传奇世界

今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义。 装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。 先简单描述下装饰者模式发挥作用的地方,当我...
  • lmj623565791
  • lmj623565791
  • 2014年04月21日 20:21
  • 17613

装饰者模式 java代码小示例

1、定义及作用该模式以对客户端透明的方式扩展对象的功能。2、涉及角色抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。具体构件角色:将要被附加功能的类,实现抽象构件角色接口。抽象装饰者角色:持有...
  • xiaoquanhuang
  • xiaoquanhuang
  • 2011年04月08日 20:07
  • 2836

我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)

解决的问题: 我们在装饰新家的时候买了几幅抽象画,买回来之后发现有些加上色彩艳丽的边框更适合我们,而有的加上玻璃罩之后更能符合我们的使用。那我们来怎么解决这个问题呢?他需要动态的给别的对象增加额...
  • tanningzhong
  • tanningzhong
  • 2015年01月24日 14:47
  • 570

学习、探究Java设计模式——装饰者模式

定义装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则要使用装饰者模式,需要满...
  • a553181867
  • a553181867
  • 2016年08月03日 22:52
  • 4395

设计模式总结之Decorator Pattern(装饰者模式)

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。...
  • cooldragon
  • cooldragon
  • 2016年08月11日 00:49
  • 1624

最常用的设计模式---装饰者模式(C++实现)

最常用的设计模式---适配器模式(C++实现)
  • lh844386434
  • lh844386434
  • 2014年01月06日 22:39
  • 2013

装饰者模式(Decorator Pattern)(一):装饰者模式介绍

一、意图 装饰者模式(又称装饰模式、包装(Wrapper)模式):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 二、适用性 以下...
  • jialinqiang
  • jialinqiang
  • 2013年05月11日 08:45
  • 1755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装饰者模式——HeaderFirst学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)