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

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

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

装饰者模式:

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

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

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

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

 

程序实现:

接口:

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等等,实现动态地给对象添加职责。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值