設計模式-裝飾模式概述和使用-IO流

ZHOU_VIP發表於2017-06-15

裝飾設計模式概述

裝飾模式就是使用被裝飾類的一個子類的例項,在客戶端將這個子類的例項交給裝飾類。是繼承的替代方案

優點

使用裝飾模式,可以提供比繼承更靈活的擴充套件物件的功能,它可以動態的新增物件的功能,並且可以隨意的組合這些功能

缺點

正因為可以隨意組合,所以就可能出現一些不合理的邏輯

package cn.itcast_02;

public interface Phone {
	
	public abstract void call();
	
}
package cn.itcast_02;

public class IPhone implements Phone {

	@Override
	public void call() {
		System.out.println("手機可以打電話了");
	}

}
package cn.itcast_02;

public abstract class PhoneDecorate implements Phone {

	private Phone p;

	public PhoneDecorate(Phone p) {
		this.p = p;
	}

	@Override
	public void call() {
		this.p.call();
	}
}
package cn.itcast_02;

public class RingPhoneDecorate extends PhoneDecorate {

	public RingPhoneDecorate(Phone p) {
		super(p);
	}

	@Override
	public void call() {
		System.out.println("手機可以聽彩鈴");
		super.call();
	}
}
package cn.itcast_02;

public class MusicPhoneDecorate extends PhoneDecorate {

	public MusicPhoneDecorate(Phone p) {
		super(p);
	}

	@Override
	public void call() {
		super.call();
		System.out.println("手機可以聽音樂");
	}
}
package cn.itcast_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流中的使用,裝飾模式在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);//也相當於裝飾
	}
}


相關文章