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类紧耦合

  • 相关阅读:
    Javascript中的sort()语法浅谈
    Javascript变量提升解释
    ES5中新增的Array方法详细说明
    Codewars-Javascript训练手册:正则表达式(Regular Expressions)
    Codewars-Javascript训练手册:Date 对象
    JavaScript与Java的关系(联系与区别)
    《Javascript秘密花园》学习笔记(终)
    (转)深入理解最强桌面地图控件GMAP.NET ---高德地图
    (转)深入理解最强桌面地图控件GMAP.NET --- 原理篇
    (转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图
  • 原文地址:https://www.cnblogs.com/jerrice/p/7390453.html
Copyright © 2011-2022 走看看