• 装饰者模式


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

  • 相关阅读:
    C# 执行bat文件 PHP
    windows服务操作 sc批处理 PHP
    HTML 彩虹 PHP
    C# 简易日志记录类 PHP
    C# 读写INI文件 PHP
    .NET Framework PHP
    序列号备忘 PHP
    获取浏览器版本信息
    数据库中Image字段存储读取数据
    [转]装机推荐 5000元铸造最强游戏平台
  • 原文地址:https://www.cnblogs.com/jerrice/p/7390453.html
Copyright © 2020-2023  润新知