装饰者模式

定义一个phone接口:

package f.struct_type_decorative_pattern;

public interface Phone {
	public abstract void call();
}

定义一个iPhone实现phone接口:

package f.struct_type_decorative_pattern;

public class IPhone implements Phone{

	@Override
	public void call() {
		System.out.println("手机可以打电话");
	}

}

实现一个最基本的装饰者抽象类:

package f.struct_type_decorative_pattern;
/**
 * 装饰的抽象类
 * @author Administrator
 *
 */
public abstract class PhoneDecorate implements Phone{
	
	private Phone p;
	public PhoneDecorate(Phone p) {
		this.p = p;
	}
	
	@Override
	public void call() {
		this.p.call();
	}
		
}

实现一个最基本的装饰者类:

package f.struct_type_decorative_pattern;

public class MusicPhoneDecorate extends PhoneDecorate{

	public MusicPhoneDecorate(Phone p) {
		super(p);
	}
	
	@Override
	public void call() {
		super.call();
		System.out.println("手机可以听音乐了");
	}
}
package f.struct_type_decorative_pattern;

public class RingPhoneDecorate extends PhoneDecorate {

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

	public void call() {
		System.out.println("手机可以听彩铃了");
		super.call();
	}
}

装饰者测试,层层功能的递加:

package f.struct_type_decorative_pattern;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 装饰者设计模式:
 * 		装饰模式就是使用被装饰类的一个子类的实例,
 * 		在客户端将这个子类的实例交给装饰类,是继
 * 		承的替代方案。
 * 
 * 优点:
 * 		使用装饰模式,可以提供比继承更灵活的扩展
 * 		对象的功能,它可以动态的添加对象的功能,
 * 		并且可以随意的组合这些功能。
 * 
 * 缺点:
 * 		正因为可以随意组合,所以就可能出现一些不
 * 		合理的逻辑。
 * 
 * @author mzy
 * 
 * 开始定义手机规则(interface)再到具体的手机(class)
 * 给手机添加装饰(interface:彩铃、听音乐),给手机进行装饰
 * 
 * 
 * 
 * 
 * 
 * 接口:定义规则
 *
 */
public class DecorativeDemo01 {
	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();
		
		// 想想我们在IO流中的使用:多层的包装让使用更方便,就是装饰最好的体现
		InputStream is = System.in;
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		
		BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
	}
}



posted @ 2018-05-19 09:12  五彩世界  阅读(81)  评论(0编辑  收藏  举报