用最简单的例子理解装饰器模式(Decorator Pattern)

假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格。最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格。

每个产品都有名称和价格,首先设计一个关于产品的抽象基类。

    public abstract class ProductBase
    {
        public abstract string GetName();
        public abstract double GetPrice();
    }

所有的产品都必须继承这个基类,比如家居用品、电器产品等,把这些具体的产品提炼成一个继承ProductBase的子类。

    public class ConcretProuct : ProductBase
    {
        private string _name;
        private double _price;

        public ConcretProuct(string name, double price)
        {
            this._name = name;
            this._price = price;
        }

        public override string GetName()
        {
            return _name;
        }

        public override double GetPrice()
        {
            return _price;
        }
    }

然后考虑产品组合。比如卖平底锅,可能送酱油,也有可能送酱油+老坛酸菜,可能的组合包括:
○ 平底锅
○ 平底锅 + 酱油
○ 平底锅 + 酱油 + 老坛酸菜

在这里,可以把酱油,老坛酸菜看作是装饰器,因为每加一个产品,都是在原有的基础上增加的。比如做"平底锅 + 酱油"这个组合,是在"平底锅"的基础上增加了"酱油"。

现在把酱油、老坛酸菜也设计成继承ProductBase的子类,也就是装饰器类。不过,与ConcretProuct类不同的是,装饰器类需要引用ProductBase,在这里,无论是显示产品组合还是计算产品产品组合价格,都离不开这个引用的ProductBase。

   public class Decorator : ProductBase
    {
        private ProductBase _product = null;
        private string _name;
        private double _price;

        public Decorator(ProductBase product, string name, double price)
        {
            this._product = product;
            this._name = name;
            this._price = price;
        }

        public override string GetName()
        {
            return string.Format("{0},{1}", _product.GetName(), _name);
        }

        public override double GetPrice()
        {
            return _product.GetPrice() + _price;
        }
    }

以上,显示产品名称的时候,把装饰器类Decorator引用的ProductBase的名称和当前名称组合起来,以逗号分隔;显示产品价格的时候,把引用的ProductBase的价格和当前价格相加。

客户端如下:

    class Program
    {
        static void Main(string[] args)
        {
            ConcretProuct livingProduct = new ConcretProuct("平底锅",100);
            Console.WriteLine(PrintProductDetails(livingProduct));

            Decorator dec1 = new Decorator(livingProduct,"海鲜酱油",10);
            Console.WriteLine(PrintProductDetails(dec1));

            Decorator dec2 = new Decorator(dec1, "老坛酸菜",12);
            Console.WriteLine(PrintProductDetails(dec2));

            Console.ReadKey();
        }

        private static string PrintProductDetails(ProductBase product)
        {
            return string.Format("产品组合:{0}     价格:{1}", product.GetName(), product.GetPrice());
        }
    }

时间: 2024-12-24 16:31:01

用最简单的例子理解装饰器模式(Decorator Pattern)的相关文章

设计模式(三)——装饰器模式(Decorator Pattern)

发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去. 首先设计一个房子类Room,实现一个进入方法Access /// <summary> /// 抽象接口 用来进行约束 /// </summary> public interface IAccess { void Access()

23种设计模式之装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 通过采用组合.而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能.避免了单独使用继承带来的“灵活性差"和"多子类衍生问题". 优点:装饰类和被装饰类可以独立发

php装饰器模式(decorator pattern)

十一点了. <?php /* The decorator pattern allows behavior to be added to an individual object instance, without affecting the behavior of other instances of the same class. We can define multiple decorators, where each adds new functionality. */ interface

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

例说装饰者模式(Decorator Pattern)

前言 装饰者模式在餐饮行业有着比较广泛的应用,网上大部分关于该模式的例子都和饮食相关,以前看译制片电影,每当看到老外们在咖啡店一口流利的点咖啡要加糖要加奶昔要加这加那的时候,感觉好有派~好高大上啊~,为啥我在小卖部都是"来瓶汽水"就没话说了呢~,难道是我不会"装"? 官方定义 动态的给一个对象添加一些职责,就增加功能来说,该模式比生成子类更为灵活--GOF Decorator模式是一种相对简单的对象结构性模式,动态和对象是个对应的关系,正如静态和类这样的对应关系,编

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

设计模式 - 装饰者模式(Decorator Pattern) 具体解释

装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 用法: 1. 首先创建组件(Component)父类, 全部类,详细组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 能够进行扩展