装饰模式概述和使用
裝飾設計模式
裝飾設計模式概述
裝飾模式就是使用被裝飾類的一個子類的實例,在客戶端將這個子類的實例交給裝飾類。是繼承的替代方案
優點
使用裝飾模式,可以提供比繼承更靈活的擴展對象的功能,它可以動態的添加對象的功能,并且可以隨意的組合這些功能
缺點
正因為可以隨意組合,所以就可能出現一些不合理的邏輯
package cn.learn_02;public class IPhone implements Phone {@Overridepublic void call() {System.out.println("手機可以打電話了");}} package cn.learn_02;public class MusicPhoneDecorate extends PhoneDecorate {public MusicPhoneDecorate(Phone p) {super(p);}@Overridepublic void call() {super.call();System.out.println("手機可以聽音樂");} } package cn.learn_02;public interface Phone {public abstract void call(); } package cn.learn_02;public abstract class PhoneDecorate implements Phone {private Phone p;public PhoneDecorate(Phone p) {this.p = p;}@Overridepublic void call() {this.p.call();} } package cn.learn_02;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Scanner;public class PhoneDemo {public static void main(String[] args) {Phone p = new IPhone();p.call();System.out.println("------------");// 需求:我想在接電話前,聽彩鈴PhoneDecorate pd = new RingPhoneDecorate(p);pd.call();System.out.println("------------");// 需求:我想在接電話后,聽音樂pd = new MusicPhoneDecorate(p);pd.call();System.out.println("------------");// 需求:我要想手機在接前聽彩鈴,接后聽音樂// 自己提供裝飾類,在打電話前聽彩鈴,打電話后聽音樂pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));pd.call();System.out.println("----------");// 想想我們在IO流中的使用// InputStream is = System.in;// InputStreamReader isr = new InputStreamReader(is);// BufferedReader br = 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);} } package cn.learn_02;public class RingPhoneDecorate extends PhoneDecorate {public RingPhoneDecorate(Phone p) {super(p);}@Overridepublic void call() {System.out.println("手機可以聽彩鈴");super.call();} }?
總結
- 上一篇: 模版设计模式概述和使用
- 下一篇: JDK5新特性回顾