Reader.class package com.bjpowernode.decorator; public interface Reader { void close(); } FileReader package com.bjpowernode.decorator; /** * 裝飾者模式中的被 ...
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(); } }