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

本文介绍装饰者模式的概念及其在Java中的应用案例。通过系统监控接口的实现,展示如何动态为对象添加新功能而不违反开闭原则。具体示例包括记录日志、发送邮件及电话通知等增强功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    装饰者模式就是给一个对象动态的添加新的功能,装饰者和被装饰者实现同一个接口,装饰者持有被装饰者的实例。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();
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值