zoukankan      html  css  js  c++  java
  • 装饰者模式——Head First

    一、定义

    装饰者模式(Decorator Pattern)动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

    二、类图

    三、星巴兹饮料

    //Component
    public abstract class Beverage{
        String description="Unkown Beverage";
        public String getDescription(){
            return description;
        }
        public abstract double cost();
    }
    
    //ConcreteDecorator
    public abstract class CondimentDecorator extends Beverage{
        public abstract String getDescription();
    }
    
    //ConcreteComponent
    public class Espresso extends Beverage{
        public Espresso(){
            description="Espresso";
        }
        public double cost(){
            return 1.99;
        }
    }
    //ConcreteComponent
    public class HouseBlend extends Beverage{
        public HouseBlend(){
            description="House Blend Coffee";
        }
        public double cost(){
            return .89;
        }
    }
    
    //ConcreteDecorator
    public class Mocha extends CondimentDecorator{
        Beverage beverage;
        public Mocha(Beverage beverage){
            this.beverage=beverage;
        }
        public String getDescription(){
            return beverage.getDescription()+",Mocha";
        }
        public double cost(){
            return .20+beverage.cost();
        }
    }
    //ConcreteDecorator
    public class Whip extends CondimentDecorator{
        //
    }
    //ConcreteDecorator
    public class Soy extends CondimentDecorator{
        //
    }
    
    //test
    public class StarbuzzCoffee{
        public static void main(String args[]){
            Beverage beverage=new Espresso();
            System.out.println(beverage.getDescription()+" $"+beverage.cost());
            
            Beverage beverage2=new DarkRoast();
            beverage2=new Mocha(beverage2);
            beverage2=new Mocha(beverage2);
            beverage2=new Whip(beverage2);
            System.out.println(beverage2.getDescription()+" $"+beverage2.cost());
            
            Beverage beverage3=new HouseBlend();
            beverage3=new Soy(beverage3);
            beverage3=new Mocha(beverage3);
            beverage3=new Whip(beverage3);
            System.out.println(beverage3.getDescription()+" $"+beverage3.cost());
        }    
    }

    四、适用性

    1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

    2、处理那些可以撤消的职责。

    3、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

    五、要点

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

    2、在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。

    3、组合和委托可用于在运行时动态地加上新的行为。

    4、除了继承,装饰都模式也可以让我们扩展行为。

    5、装饰者模式意味着一群装饰者类,这些类用来包装具体组件。

    6、装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。

    7、装饰者可以在被装饰者的行为前面与(或)后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。

    8、你可以用无数个装饰者包装一个组件。

    9、装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。

    10、装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。

  • 相关阅读:
    spark实验四(2)
    spark实验四
    神奇的一天
    Spark实验三
    Scala实验任务三
    Scala实验任务二
    Scala语言实验任务一
    kettle的基本使用
    质量属性之安全性战术
    datax相关
  • 原文地址:https://www.cnblogs.com/aaron-shu/p/5246280.html
Copyright © 2011-2022 走看看