装饰者设计模式

Reader.class
package com.bjpowernode.decorator;

public interface Reader {
    
    void close();
    
}

FileReader 

package com.bjpowernode.decorator;

/**
 * 装饰者模式中的被装饰者
 */
public class FileReader implements Reader{

    /**
     * 被装饰的方法
     */
    public void close(){
        System.out.println("FileReader is closed!");
    }
    
}

被装饰者BufferedReader 

package com.bjpowernode.decorator;


/**
 * 装饰者模式中的装饰者
 */
public class BufferedReader implements Reader{
    
    //在装饰者中有一个被装饰者的引用
    //private FileReader reader; //这种固定的装饰,只能装饰这一种具体的类型。扩展性差。
    
    //这样可以装饰Reader类型的所有子类型。
    private Reader reader;
    
    
    //创建装饰者对象的构造函数
    /*
    public BufferedReader(FileReader reader){
        this.reader = reader;
    }
    */
    
    public BufferedReader(Reader reader){
        this.reader = reader;
    }
    
    //装饰者和被装饰者应该具有相同的行为。
    //我们希望在使用装饰者的时候就像在使用被装饰者。不被用户所察觉,用户还是以为他在使用“被装饰者对象”。
    public void close(){
        
        System.out.println("低耦合扩展代码1");
        
        //装饰者模式中并没有控制“被装饰者”,一直强调的是装饰,没有修改,没有控制。
        reader.close();
        
        System.out.println("低耦合扩展代码2");
    }
}

Test 

package com.bjpowernode.decorator;

/**
 *    1、装饰者设计模式主要解决的问题是:
 *        “低耦合”的对被装饰者的功能“扩展”,
 *        不是修改、不是控制。所谓的扩展就是在原先的代码基础之上添加程序。 
 */
public class Test {

    public static void main(String[] args) {
        
        //创建被装饰者对象
        FileReader reader = new FileReader();
        
        //创建装饰者对象
        //BufferedReader br = new BufferedReader(reader);
        Reader br = new BufferedReader(reader);
        
        //通过调用装饰者中的装饰方法对被装饰者进行装饰。这个过程就是一个功能扩展。
        br.close();
        
    }

}

 

 
posted @ 2020-02-27 00:28  Ayan_ayan  阅读(138)  评论(0编辑  收藏  举报