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

    http://lgbolgger.iteye.com/blog/2154368 

    有时候为了传承某个类的一些功能,我们可以采用继承该类来获取功能,并可以通过覆写某些方法来进行功能加强。然而若想对一批类的功能进行加强,如果仍采用继承,不仅在代码上重复,并且不利于扩展。

    public interface Component {
    
        public void  fun();
    }
    
    public class ConcreteAComponent implements Component{
    
        @Override
        public void fun() {
            System.out.println("ConcreteAComponent");
        }
    
    }
    
    public class ConcreteBComponent implements Component{
    
        @Override
        public void fun() {
            System.out.println("ConcreteBComponent");
        }
    
    }

    如果采用继承的话,加强ConcreteAComponent,则需要写一个类继承ConcreteAComponent,加强ConcreteBComponent,则需要写一个类继承ConcreteBComponent,就会造成每当要加强一个类时就必须要新建一个类继承它,在代码上造成严重的重复。

    ConcreteTimeDecorator 针对的是接口Component ,不依赖于任何一个具体的Component ,所以每当要增强一个具体的Component时,不用再添加新的类,和继承就不一样了,这样更加容易扩展。

    public class ConcreteTimeDecorator implements Component{
        
        private Component component;
    
        public ConcreteTimeDecorator(Component component) {
            super();
            this.component = component;
        }
    
        @Override
        public void fun() {
            long start=System.currentTimeMillis();
            System.out.println("start at "+start);
            component.fun();
            long end=System.currentTimeMillis();
            System.out.println("end at "+end+",cost "+(end-start));
        }
    
    }
    public class ConcretePrintDecorator implements Component{
    
        private Component component;
    
        public ConcretePrintDecorator(Component component) {
            super();
            this.component = component;
        }
    
        @Override
        public void fun() {
            System.out.println("before real component run");
            component.fun();
            System.out.println("after real component run");
        }
    
    }
    ConcreteAComponent concreteAComponent=new ConcreteAComponent();
            
            ConcreteTimeDecorator concreteTimeDecorator=new ConcreteTimeDecorator(concreteAComponent);
            concreteTimeDecorator.fun();
            
            System.out.println("--------------------------------------------");
            ConcretePrintDecorator concretePrintDecorator=new ConcretePrintDecorator(concreteAComponent);
            concretePrintDecorator.fun();

     装饰器类与Component类紧耦合

  • 相关阅读:
    php 经验之谈
    3)nginx的启动与停止、重启,linux配置对外端口
    git 的使用
    mysql基本定义--数据类型
    Web安全XSS
    SQL优化 csdn
    数据库隔离级别
    Web前段优化,提高加载速度 css
    jquery的height()和javascript的height总结,js获取屏幕高度
    highcharts笔记 highcharts学习 highcharts用法
  • 原文地址:https://www.cnblogs.com/jerrice/p/7390453.html
Copyright © 2011-2022 走看看