/**裝飾者模式 * 裝飾者模式就是使用被裝飾類的一個子類的執行個體,在用戶端將 * 這個子類的執行個體交給裝飾類。是整合的替代方案 * 優點:使用裝飾模式,可以提供比繼承更靈活的擴充項物件的功能,它可以動態添加對象 * 的功能,並且可以隨意地組合這些功能。 * 缺點:正因為可以隨意組合,所以就可能出現一些不合理地邏輯 *///首先建立手機類介面package july.star.decorate;/** * Phone * 建立手機類介面 * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午8:59:36 * @version 1.0 */public interface Phone { //每個手機都有打電話的功能 public void call();}//實現其介面package july.star.decorate; /** * IPhone * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午9:01:17 * @version 1.0 */public class IPhone implements Phone{ @Override public void call() { System.out.println("手機可以打電話了。"); }}//建立抽象的手機抽象類別package july.star.decorate;/** * PhoneDecotate * 建立抽象的手機裝飾類 * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午9:03:29 * @version 1.0 */public abstract class PhoneDecorate implements Phone{ private Phone p; public PhoneDecorate(Phone p){ this.p = p; } @Override public void call() { p.call(); }}//給手機裝飾彩鈴功能package july.star.decorate; /** * RingPhoneDecorate * 給手機裝飾彩鈴功能 * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午9:26:02 * @version 1.0 */public class RingPhoneDecorate extends PhoneDecorate{ public RingPhoneDecorate(Phone p) { super(p); } @Override public void call() { System.out.println("手機可以聽彩鈴"); super.call(); }}//給手機添加播放視頻功能package july.star.decorate; /** * MusicPhoneDecorate * 給手機添加播放視頻功能 * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午9:29:04 * @version 1.0 */public class PlayPhoneDecorate extends PhoneDecorate{ public PlayPhoneDecorate(Phone p) { super(p); } @Override public void call() { super.call(); System.out.println("手機可以播放視頻了"); }}//測試package july.star.decorate;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.Scanner;/** * PhoneDemo * 裝飾者模式 * 裝飾者模式就是使用被裝飾類的一個子類的執行個體,在用戶端將 * 這個子類的執行個體交給裝飾類。是整合的替代方案 * 優點:使用裝飾模式,可以提供比繼承更靈活的擴充項物件的功能,它可以動態添加對象 * 的功能,並且可以隨意地組合這些功能。 * 缺點:正因為可以隨意組合,所以就可能出現一些不合理地邏輯 * @author MoXingJian * @email 939697374@qq.com * @date 2016年12月11日 下午9:06:30 * @version 1.0 */public class PhoneDemo { public static void main(String[] args) { Phone p = new IPhone(); p.call(); System.out.println("-----------------------"); // 打電話前聽彩鈴 // 給手機添加彩鈴功能 RingPhoneDecorate rpd = new RingPhoneDecorate(p); rpd.call(); System.out.println("-----------------------"); // 打完電話後看視頻 // 給手機添加播放視頻 PlayPhoneDecorate pd = new PlayPhoneDecorate(p); pd.call(); System.out.println("-----------------------"); // 打電話前聽彩鈴,打完電話後播放視頻 RingPhoneDecorate r = new RingPhoneDecorate(new PlayPhoneDecorate(p)); r.call(); System.out.println("-----------------------"); // 類似的IO流也是裝飾者模式設計 InputStream is = System.in; // 位元組流 // 封裝 InputStreamReader isr = new InputStreamReader(is); // 字元流,單讀取一個 // 再封裝 BufferedReader bis = new BufferedReader(isr); // 可以用一行來表示 // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //又或者是控制台錄入 //Scanner sc = new Scanner(System.in); }}