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、装饰者模式在设计中会出现许多小对象,如果过度使用,将会使程序便的很复杂

    用放荡不羁的心态过随遇而安的生活
  • 相关阅读:
    Ext.grid.column.Column主要配置项及示例
    Ext.grid.Panel主要配置及示例
    EF Code First关系规则及配置
    ExtJS4系列目录
    EF Code First数据库连接配置
    ASP.NET MVC系列:ASP.NET MVC简介
    Ext JS下载及配置
    Ext.container.Viewport
    Ext.tab.Panel页签
    ASP.NET MVC系列:Controller/Action
  • 原文地址:https://www.cnblogs.com/re-myself/p/5532491.html
Copyright © 2011-2022 走看看