装饰者模式——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 设计类图


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

相关文章推荐

《Head First 设计模式》学习笔记——装饰者模式

《Head First 设计模式》学习笔记——装饰者模式概念动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案eg:当我们需要设计一个饮料的订单系统,一般我们会先设计一个基类...

《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

装饰者模式是JDK中另一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源码,也是为了学习大牛们的设计思路。————题...

headfast设计模式学习笔记02 装饰者

引入设计原则:类应该对扩展开放,对修改关闭 目的:是类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。 如观察者模式,装饰者模式。 注意:1没必要每个部分都遵循开放-关闭原则,因为...

装饰者模式学习笔记

最近看了一个视频教程,讲到装饰者模式,为加深一下理解,所以在这里做个笔记 一,为什么要用到装饰者模式开发中,有时我们需要对一个对象的功能进行增强。通常的增强方式有: 1. 继承 被增强的对象是固...
  • LH0102
  • LH0102
  • 2017年04月11日 15:53
  • 100

设计模式学习笔记之装饰者模式

定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。...
  • guo_net
  • guo_net
  • 2014年07月26日 14:43
  • 344

设计模式学习笔记-装饰者模式

装饰者模式 作为一个程序员在做程序开发得过程中最烦得莫过于需求更改后对原来代码得更改。这其中带来得问题有可能远远超过需要更改得问题个数。所以如果做到“不更改,只扩展”将会带来直观的改变。而装饰者模式就...

Head First设计模式学习笔记-------(3)装饰者模式

在本章你将学到如何使用对象组合方式,做到在运行时装饰类。 今天我们项目例子是一家咖啡店,让我们先来看看这个项目的类图吧。 购买咖啡时,也可以加入各种调料,服务员会根据加入的调料收取...

[学习笔记]设计模式[2]-{装饰者模式}

装饰者模式

《HeadFirst设计模式》学习笔记2-装饰者模式

说明装饰者模式动态地将责任附加到对象上。若要拓展功能,装饰着提供了比继承更有弹性的替代方案。类图要点 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。 在我们的设计中,应该允许行为被扩展,而无...

设计模式之禅学习笔记--装饰者模式

一、定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式相比生成子类更为灵活。 二、通用类图 1:Component 抽象构件。Component是一个接口或者是抽象类,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装饰者模式——HeaderFirst学习笔记
举报原因:
原因补充:

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