美文网首页
structure:装饰器模式 (Decorate Patter

structure:装饰器模式 (Decorate Patter

作者: 柳源居士 | 来源:发表于2019-02-19 22:33 被阅读0次

    定义:
    动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

    • 解决继承滥用的问题,类设计死板,类数量膨胀,以及基类的新功能不适用于所有的类。
    • 符合开放-封闭原则
    • 缺点:会形成很多的小类,如果不熟悉装饰器模式,可能会对程序员造成一些困扰。
      设计思想:
      设计一个主体,然后设计一些装饰器,在运行时来装饰它。
      装饰器体现的是“包装”的思想,一层一层包装。每层的类型都一致,因为继承同一个基类。

    实现:

    package Decorate;
    
    /*
    / 饮料的基类,抽象组件,有点最终产品的意思,负责定义行为与描述。
     */
    public abstract class Beverage {
        String description="Unknown Beverage";
    
        public String getDescription() {
            return description;
        }
    
        public abstract double cost();
    }
    

    package Decorate;
    
    /*
    调料类,抽象装饰者,声明用来声明半成品的描述的意思
     */
    public abstract class CondimentDecorator extends  Beverage{
        @Override
        public abstract String getDescription();
    }
    

    package Decorate;
    
    public class DarkRoast extends Beverage {
        //深焙咖啡
        public DarkRoast() {
            description="DarkRost";
        }
    
        @Override
        public double cost() {
            return 0.99;
        }
    }
    

    package Decorate;
    
    public class Decat extends Beverage {
    
        public Decat() {
            description="Decat";
        }
    
        @Override
        public double cost() {
            return 1.05;
        }
    }
    

    package Decorate;
    
    public class Espresso extends Beverage {
        //浓缩咖啡
        public Espresso() {
            description="Espresso";
        }
    
        @Override
        public double cost() {
            return 1.99;
        }
    }
    

    package Decorate;
    
    /*
    具体组件,有点相当于半成品的意思
     */
    public class HouseBlend extends  Beverage {
        public HouseBlend() {
            description="House Blend Coffee";
        }
    
        @Override
        public double cost() {
            return 0.89;
        }
    }
    

    package Decorate;
    
    public class Mocha extends CondimentDecorator {
        Beverage beverage;
    
        public Mocha(Beverage beverage) {
            this.beverage = beverage;
        }
    
        //描述完整的调用过程
        @Override
        public String getDescription() {
            return beverage.getDescription()+", Mocha";
        }
    
        @Override
        public double cost() {
            return 0.20+beverage.cost();
        }
    }
    

    package Decorate;
    
    public class Soy extends CondimentDecorator {
        Beverage beverage;
    
        public Soy(Beverage beverage) {
            this.beverage = beverage;
        }
    
        //描述完整的调用过程
        @Override
        public String getDescription() {
            return beverage.getDescription()+", Soy";
        }
    
        @Override
        public double cost() {
            return 0.10+beverage.cost();
        }
    }
    

    package Decorate;
    
    public class TestDecorate {
        public static void test(){
            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());
    
    
    
        }
    }
    

    package Decorate;
    
    /*
    奶泡
     */
    public class Whip extends CondimentDecorator {
        Beverage beverage;
    
        public Whip(Beverage beverage) {
            this.beverage = beverage;
        }
    
        //描述完整的调用过程
        @Override
        public String getDescription() {
            return beverage.getDescription()+", Whip";
        }
    
        @Override
        public double cost() {
            return 0.30+beverage.cost();
        }
    }
    

    引申学习:
    java 里的java.io 类数量庞大,但是也是利用了装饰者模式创建的,理解装饰者模式,就能理解大量的io类。
    比如InputStream类,相当于beverage。
    FileInputstream、StringBufferInputStream、ByteArrayInputStream相当于具体的饮料,都继承自InputStream(beverage)。
    FileterInputStream相当于CondimentDecorate,继承自InputStream(beverage)而
    该类的子类PushbackInputStream、BufferedInputStream、DataInputStream、LineNumberInputStream相当于调料类,也都继承自FilterInputStream(CondimentDecorate)。

    我们可以利用装饰器模式,创建自己的I/O 装饰者。
    继承FileterInputStream,然后在构造方法里面组合需要用的FileterInputStream的子类的功能。

    相关文章

      网友评论

          本文标题:structure:装饰器模式 (Decorate Patter

          本文链接:https://www.haomeiwen.com/subject/cnnieqtx.html