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(); } }