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

  • 相关阅读:
    创建自定义图标和图像
    使用_CRTDBG_LEAK_CHECK_DF检查VC程序的内存泄漏(转)
    Hadoop Netflix数据统计分析2(转)
    系统提供的按钮和图标
    STATIC变量问题
    表格视图,文本视图和Web视图
    Hadoop Netflix数据统计分析1(转)
    获取程序数据路径(转)
    C++中STRING转为INT (转)
    netflix 推荐算法学习1(转)
  • 原文地址:https://www.cnblogs.com/jerrice/p/7390453.html
Copyright © 2011-2022 走看看