`
wuhongyu
  • 浏览: 404448 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

JAVA设计模式学习笔记3——装饰者模式

阅读更多

装饰者模式——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

    装饰者模式就是给一个对象动态的添加新的功能,装饰者和被装饰者实现同一个接口,装饰者持有被装饰者的实例。JAVA中IO就大量使用了装饰者模式,如:

 

InputStream in = new BufferedInputStream(new FileInputStream("test.txt"));

 其 中FileInputStream、BufferedInputStream都实现了InputStream,BufferedInputStream就 是一个装饰者,增加利用缓冲输入来改进性能,以及FileInputStream所没有的readLine()方法来增强接口。

 

    假如我们有一个系统监控的接口,它的功能很简单,就是当系统发生异常时进行处理动作。然后我们实现了一个能够日志记录的实现类,当系统发生异常只要把日志 记录好就可以了。可是后来我们又想记录完日志后需要给维护人员发邮件,根据开闭原则,我们不能去修改记录日志的类啊,所以这时就需要用到装饰模式了,定义 一个能发送邮件的监控接口实现类,它其中保持了一个监控接口的实例(那个能记日志的实现类),这时,我们调用本实现类时,就即能记录日志,又能发邮件了。 再后来,老大又想加一个系统发生严重异常时能电话通知的功能,没关系,再写一个能电话通知的实现类,什么都不用改,OK了!

 

系统监控的接口:

public interface Monitor {
	//系统发生异常时的处理方法
	public void handle();
}
 记录日志的实现类:
public class LoggerMonitor implements Monitor {

	@Override
	public void handle() {
		System.out.println("日志已记录;");
	}

}
 发送邮件的实现类:
public class EmailMonitor implements Monitor {
	
	private Monitor monitor;
	
	public EmailMonitor(Monitor monitor){
		this.monitor = monitor;
	}
	@Override
	public void handle() {
		monitor.handle();
		System.out.println("邮件已发送;");
	}

}
 电话通知的实现类:
public class PhoneMonitor implements Monitor {

	private Monitor monitor;
	
	public PhoneMonitor(Monitor monitor){
		this.monitor = monitor;
	}
	@Override
	public void handle() {
		this.monitor.handle();
		System.out.println("已电话通知");
	}

}

测试类:

public class Test {

	/**
	 * 装饰者模式——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
	 * 
	 * 装饰者模式就是给一个对象动态的添加新的功能,装饰者和被装饰者实现同一个接口,装饰者持有被装饰者的实例。
	 * @param args
	 */
	public static void main(String[] args) {
		//既想记录日志又想邮件通知
		Monitor monitor = new EmailMonitor(new LoggerMonitor());
		monitor.handle();
		System.out.println("------------------------------");
		//既想记录日志又想电话通知
		monitor = new PhoneMonitor(new LoggerMonitor());
		monitor.handle();
		System.out.println("------------------------------");
		//既想记录日志,又发邮件,又打电话
		monitor = new PhoneMonitor(new EmailMonitor(new LoggerMonitor()));
		monitor.handle();
	}

}
 
0
2
分享到:
评论
1 楼 di1984HIT 2015-02-06  
写的真不错~

相关推荐

Global site tag (gtag.js) - Google Analytics