设计模式回顾之六:装饰者模式(Decorator)

本文详细解析了装饰者模式的概念、适用场景及其程序实现,通过具体实例展示了如何利用装饰者模式动态扩展对象功能,以解决复杂组合情况下的代码复用问题。文章深入浅出地阐述了模式的核心思想,并提供了实际应用中的代码示例,帮助开发者更好地理解和应用这一设计模式。

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

设计模式回顾系列文章: 主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。

------------------------------------------------

装饰者模式:

动态地给一个对象添加职责,可以无需创建子类,而扩展一个对象的功能。

适用情景:各种可选的功能在另一个肯定要执行的功能之前或者之后执行。

实现:创建一个抽象类来表示原类和要添加到这个类的新功能。在装饰类中,将对新功能的调用放在对紧随其后对象的调用之前或之后,以获得正确的顺序。

举例:在类使用时如果有多种组合情况时,例如:蛋糕类 -> 奶油蛋糕、巧克力蛋糕、果仁蛋糕、奶油巧克力蛋糕、奶油果仁蛋糕.....如果为每一种组合都建立一个子类的话,则需要很多子类,这时可以考虑装饰者模式。

 

程序实现:

接口:

public interface Work {
	public void working();
}

原始实现类:

public class Programmer implements Work{
	public void working() {
		System.out.println("编写程序中...");
	}
}

装饰类1:

public class ProgrammerDecorator implements Work{
	private Work work;
	
	public ProgrammerDecorator(Work work){
		this.work = work;
	}
	public void working() {
		designing();
		work.working();//装饰顺序可变...
		debuging();
	}
	//新增加的装饰性方法:设计程序
	public void designing(){
		System.out.println("设计程序中...");
	}
	//新增加的装饰性方法:修改Bug
	public void debuging(){
		System.out.println("修改Bug中...");
	}
}

装饰类2:

public class TeamLeaderDecorator implements Work{
	private Work work;
	
	public TeamLeaderDecorator(Work work){
		this.work=work;
	}
	public void working() {
		allotTasks();
		work.working();
	}
	//分配任务
	public void allotTasks(){
		System.out.println("分配任务");
	}
}

程序入口:

public static void main(String[] args) {
		Work programmer=new Programmer();
		System.out.println("未被装饰时:");
		programmer.working();//未被装饰时
		System.out.println();
		
		System.out.println("单重装饰后:");
		ProgrammerDecorator pd=new ProgrammerDecorator(programmer);
		pd.working();
		System.out.println();
		
		System.out.println("多重装饰后:");
		TeamLeaderDecorator tld=new TeamLeaderDecorator(new ProgrammerDecorator(programmer));
		tld.working();
	}

 

举例:IO类库大量使用了装饰者模式,例如BufferedReader包装FileReader、BufferedInputStream包装FileInputStream等等,实现动态地给对象添加职责。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值