设计模式之装饰模式

装饰设计模式

l对原有类进行了功能的改变,增强。
l装饰模式的基本格式。
l它与继承有什么不同?
package cn.itcast.io.p5.wrapper;

public class WrapperDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Person p = new Person();
//		NewPerson p = new NewPerson();
		NewPerson pp = new NewPerson(p);
		pp.chifan();
		
		/*
		 * 装饰模式:为了解决给类的功能进行增强而出现的。
		 * 
		 * Writer
		 * 		|--TextWriter
		 * 		|--MediaWriter
		 * 
		 * 想要对流对象的功能进行增强,比如提高写入的效率。
		 * 使用缓冲技术。
		 * Writer
		 * 		|--TextWriter
		 * 				|--BufferedTextWriter
		 * 		|--MediaWriter
		 * 				|--BufferedMediaWriter
		 * 
		 * 每一个子类这样实现是可以的,但是导致继承体系较为臃肿。
		 * 发现其实无论哪个子类需要高效,使用的都是缓冲技术。
		 * 干脆将缓冲技术进行单独的描述和封装。
		 * 要缓冲区谁,就将谁传给缓冲区。
		 * BufferdWriter
		 * 
		 * class BufferedWriter extends Writer
		 * {
		 * 		BufferedWriter(Writer w)
		 * 		{}
		 * }
		 * 
		 * 装饰设计模式。
		 * Writer
		 * 		|--TextWriter
		 * 		|--MediaWriter
		 * 		|--BufferedWriter
		 * 
		 * 装饰类和被装饰的特点:
		 * 1,装饰类中的构造函数需要接受被装饰类。
		 * 2,装饰类和被装饰类应该所属于同一个体系。
		 * 
		 */
	}

}

class Person{
	void chifan(){
		System.out.println("吃饭");
	}
}

class NewPerson{
	
	private Person p ;
	NewPerson(Person p){
		this.p = p;
	}
	
	public void chifan(){
		
		System.out.println("开胃酒");
		p.chifan();
		System.out.println("甜点");
		System.out.println("来一根");
		
	}
}




/*
class NewPerson extends Person{

	@Override
	void chifan() {
		
		System.out.println("开胃酒");
		super.chifan();
		System.out.println("甜点");
		System.out.println("来一根");
		
	}
	
	
}

*/




要求你自己实现一个类MyInputStream读取文件,且不能抛出异常

Is a --- > 是一个
Has a  有一个 - 包裹

包装、包裹:
自己不实现任何功能,所有功能都是通过内部的成员变量实现的。

包装是指一个类是某个类的子类,且拥有这个类的成员,就是包装模式。
如果A包装了B则:
A extends|implments B{
Private B b;
}
包装的目的是,让子类变成某个类的子类,且增强被包装类的方法。
包装类从来不做任何的工作,都是通过内部的被包装类,即成员变量执行方法的。

public class TestDemo {
	public static void main(String[] args) throws Exception {
		InputStream in = new MyInputStream("d:/a/a.txt");
		byte[] b = new byte[1024];
		int len = 0;
		while((len=in.read(b))!=-1){
			String s = new String(b,0,len);
			System.err.print(s);
		}
		in.close();
	}
}
class MyInputStream extends InputStream{
	private InputStream in;
	public MyInputStream(String fileName) {
		try {
			in = new FileInputStream(fileName);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	public int read(byte[] b){
		int len=-1;
		try {
			len = in.read(b);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return len;
	}
	public void close(){
		try {
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	@Override
	public int read() throws IOException {
		return 0;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值