包装设计模式

l当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强:
编写子类,覆盖需增强的方法
使用Decorator设计模式对方法进行增强
l疑问:在实际应用中遇到需增强对象的方法时,到底选用哪种方式呢?
没有具体的定式,不过有一种情况下,必须使用Decorator设计模式: 即被增强的对象,开发人员只能得到它的对象,无法得到它的 class 文件
比如request、response对象,开发人员之所以在servlet中能通过sun公司定义的HttpServletRequest\response接口去操作这些对象,是因为Tomcat服务器厂商编写了request、response接口的实现类。web服务器在调用servlet时,会用这些接口的实现类创建出对象,然后传递给servlet程序。
此种情况下,由于开发人员根本不知道服务器厂商编写的request、response接口的实现类是哪个?在程序中只能拿到服务器厂商提供的对象,因此就只能采用Decorator设计模式对这些对象进行增强。

/*

 * 包装设计模式
 * 1.实现与被增强对象相同的接口
 * 2.定义一个变量记住被增强对象
 * 3.定义一个构造器,接收被增强对象
 * 4.覆盖需要增强的方法
 * 5.对于不想增强的方法,直接调用被增强的对象的方法

 */


package cn.itcast.wrapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;

 
public class BufferedReaderWrapper extends BufferedReader {
	private BufferedReader br;
	private int linenum = 1;

	public BufferedReaderWrapper(BufferedReader in) {
		super(in);// 子类实例化时,必然会调用父类的构造函数。如果父类没有无参的构造函数,就是调用有参的构造函数
		this.br = in;
	}

	@Override
	public String readLine() throws IOException {
		String line = br.readLine();
		if (line == null) {
			return line;
		} else {

			return linenum++ + ":" + line;
		}

	}

}

对应的测试类

package cn.itcast.wrapper;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TestBufferedReaderWrapper {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(
				"src/cn/itcast/wrapper/BufferedReaderWrapper.java"));
		BufferedReaderWrapper wrapper = new BufferedReaderWrapper(br);

		FileWriter fw = new FileWriter("d:\\1.java");

		String line = null;
		while ((line = wrapper.readLine()) != null) {
			fw.write(line + "\r\n");
		}
		fw.close();
		wrapper.close();
		br.close();
	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值