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

    定义

    动态的给一个对象添加一些额外的职责。就功能来说,装饰模式相比生成子类更加灵活

    使用场景

    1. 装饰类和被装饰类都可以独立发展,不会耦合,它是继承关系的一个替代方案
    2. 需要扩展一个类的功能,或者给一个类增加附加功能
    3. 动态增加一个类的功能,再动态的撤销
    4. 需要为一批兄弟类,进行改装或者加装功能首选装饰模式

    实现方式

    组件接口

    /**
     * 基础接口
     **/
    public interface Component {   
        public void operate();
    }
    

    组件实现类

    /**
     * 具体实现类
     **/
    public class ConcretComponent implements Component {
    
        public void operate() {   
            System.out.println("ConcretComponent operate");
        }
    }
    

    装饰类

    /**
     * 装饰类
     **/
    public class Decorator implements Component {
    
        public Component component;
        
        public Decorator(Component component) {
            
            this.component = component;
        }
        
        public void operate() {       
            this.component.operate();
        }
    }
    

    具体装饰类

    /**
     * 具体装饰类
     **/
    public class ConcreteDecorator extends Decorator {
    
        public ConcreteDecorator(Component component) {
            super(component);
        }
    
        public void operate() {
            
            System.out.println("ConcreteDecorator operate");
            this.component.operate();
        }
    }
    

    扩展与思考

    1. 代理模式和装饰器模式的区别。对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能;对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。

    2. JDKjava.io流就是用了装饰器模式,对InputStream进行增强。可以对流分为三层。

      第一层:Reader、Writer、InputStream、OutputStream,对应抽象的接口

      第二层:FilterOutputStreamFilterInputStreamFilterWriterFilterReader这些带有Filter的类对应抽象的装饰者,这里也不一定要使用接口和抽象类,比如FilterOutputStream就是具体的实现类。这也属于装饰器模式。另外InputstreamReader也可以算抽象的装饰者,只是这里只对StreamDecoder类型进行装饰。

      第二层其他:第二层中除了上述提到的5个类,其他的都可以看做是具体的被装饰者。

      第三层:第三层都是具体的装饰者 比如:PrintStreamDateOutputStreamBufferInputSteam等。可以使用这些装饰器,对第二层中的类进行装饰。

    3. HttpServletRequestWrapper也是装饰类,继承该类可以实现对某些敏感字眼的过滤功能。

  • 相关阅读:
    死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
    死磕 java同步系列之AQS起篇
    死磕 java同步系列之自己动手写一个锁Lock
    死磕 java同步系列之synchronized解析
    死磕 java同步系列之volatile解析
    死磕 java同步系列之JMM(Java Memory Model)
    解决Linux下SSH超时自动断开
    Git常用命令
    JVM常用虚拟机命令汇总
    理解GC日志
  • 原文地址:https://www.cnblogs.com/fzsyw/p/11330998.html
Copyright © 2011-2022 走看看