zoukankan      html  css  js  c++  java
  • java设计模式学习(三)装饰者模式(decorator)

         装饰者模式动态的将功能(需要扩展的东西)附加的对象上,所以对于扩展功能,装饰者模式提供了比继承更有弹性的方案。而装饰者模式也完全符合 开发--关闭(对扩展开放,对修改关闭)的OO设计原则。

      中秋快到了,改吃月饼了

    public abstract class Cake {
    
        String description="primary taste";
    
        public String getDescription() {
            return description;
        }
        
      public abstract double cost();  
    }
    定义一个抽象的饼类,然后装饰者和组件(被装饰者)都需要继承它

    组件:

    public class Mooncakes extends Cake{
    
        public Mooncakes() {
            this.description="Mooncake";
        }
        
        @Override
        public double cost() {
            // TODO Auto-generated method stub
            return 12.00;
        }
    
    }
    这个饼只是个“饼”,而不是我们需要的月饼,那么需要加点馅

    public abstract class CondimentDecorator extends Cake{
    
        @Override
        public abstract String getDescription();
        @Override
        public  abstract double cost();
    
    }
    public class Peanut extends CondimentDecorator{
    
        Cake cake;
        public Peanut(Cake cake) {
            this.cake=cake;
        }
        
        @Override
        public String getDescription() {
            System.out.println(cake.getDescription());
            return cake.getDescription()+", Peanut";
        }
    
        @Override
        public double cost() {
            // TODO Auto-generated method stub
            return 1.10+cake.cost();
        }
    
    }
    OK,现在可以测试一把了

        public static void main(String[] args) {
            Cake cake= new Mooncakes();
            System.out.println(cake.description);
            Cake cake2= new Mooncakes();
            cake2=new Peanut(cake2);
            System.out.println(cake2.getDescription()+"::"+cake2.cost());
            
        }

    输出:

    Mooncake
    Mooncake
    Mooncake, Peanut::13.1
    


    而更现实的装饰者模式的例子就是java.IO下的类,



    我们可以看到FilterInputStream就是一个抽象的装饰者,如果对现有的java IO功能不满意,可以继承这个抽象类进行扩展。java.io中使用装饰者模式也造成了一个缺点,就是类特别多,相信每个初学者看到java.io都会蒙了。

    总结:

    1、 在设计中应该允许行为被扩展,无须修改现有的代码;

    2、组合和委托可动态的给对象加上新的行为。

    3、装饰者模式在设计中会出现许多小对象,如果过度使用,将会使程序便的很复杂

    用放荡不羁的心态过随遇而安的生活
  • 相关阅读:
    c语言学习指针变量
    SQL字符串函数
    [转]HttpWebRequest使用注意(发生阻塞的解决办法)
    Image.FormFile的锁文件解决
    不联网在win8安装framework3.5
    metro app损坏,修复以及商店速度慢的解决方法
    关于C#使用来电通的来电通内部原理浅析
    winform模拟qq聊天界面的小功能textbox1输入自动跳到textbox2
    C#下的路由器后台登录
    dropbox文件夹路径丢失变回默认文件的解决方法
  • 原文地址:https://www.cnblogs.com/re-myself/p/5532491.html
Copyright © 2011-2022 走看看