意图:

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比于生成子类更为灵活。该模式以对客户端透明的方式扩展对象的功能。

适用环境

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

处理那些可以撤销的职责。

当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使的子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

涉及角色:

抽象组件:定义一个抽象接口,来规范准备附加功能的类。

具体组件:将要被附加功能的类,实现抽象构件角色接口。

抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。

具体装饰:实现抽象装饰者角色,负责为具体构件添加额外功能

代码实现

Drink.java                            被装饰者对象的接口

SoyaBeanMilk.java                具体的被装饰者对象

EggDecorator.java                 具体装饰者对象

SugerDecorator.java     具体装饰者对象

BlackBeanDecorator.java   具体装饰者对象

Decorator.java        装饰者基类

Test.java             测试

package com.vince.decorator;
/**
* 抽象的被装饰者接口
* @author Administrator
*
*/
public interface Drink {
public String description();
public float cost();
}
package com.vince.decorator;
/**
* 具体的被装饰者类
* @author Administrator
*
*/
public class SoyaBeanMilk implements Drink{ public String description(){
return "豆浆";
}
public float cost(){
return 3f;
} }
package com.vince.decorator;
/**
* 具体装饰者对象
* @author Administrator
*
*/
public class SugerDecorator extends Decorator { public SugerDecorator(Drink drink) {
super(drink);
// TODO 自动生成的构造函数存根
} @Override
public String description() {
// TODO 自动生成的方法存根
return super.description()+"+糖";
} @Override
public float cost() {
// TODO 自动生成的方法存根
return super.cost()+0.5f;
} }
package com.vince.decorator;
/**
* 具体装饰者对象
* @author Administrator
*
*/
public class EggDecorator extends Decorator { public EggDecorator(Drink drink) {
super(drink);
// TODO 自动生成的构造函数存根
} public String description(){
return super.description()+"+鸡蛋";
}
public float cost(){
return super.cost()+3f;
} }
package com.vince.decorator;
/**
* 具体装饰者对象
* @author Administrator
*
*/
public class BlackBeanDecorator extends Decorator { public BlackBeanDecorator(Drink drink) {
super(drink);
// TODO 自动生成的构造函数存根
}
@Override
public String description() {
// TODO 自动生成的方法存根
return super.description()+"+黑豆";
}
@Override
public float cost() {
// TODO 自动生成的方法存根
return super.cost()+2f;
}
}
package com.vince.decorator;

public class Test {

    /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Drink drink=new SoyaBeanMilk();
SugerDecorator suger=new SugerDecorator(drink);
BlackBeanDecorator blackBean=new BlackBeanDecorator(suger);
EggDecorator egg=new EggDecorator(blackBean); System.out.println("点的早餐是"+egg.description());
System.out.println("共花的钱"+egg.cost());
} }
package com.vince.decorator;
/**
* 装饰者抽象类
* @author Administrator
*
*/
public abstract class Decorator implements Drink {
private Drink drink;//要装饰的对象
public Decorator(Drink drink){
this.drink=drink;
}
@Override
public String description() {
// TODO 自动生成的方法存根
return drink.description();
} @Override
public float cost() {
// TODO 自动生成的方法存根
return drink.cost();
} }

装饰者模式小结:

oo原则:动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。

要点:

1、继承属于扩展形式之一,但不见的是达到弹性设计的最佳方案

2、在我们的设计中,应该允许行为可以被扩展,而不须修改现有的代码

3、组合和委托可用于在运行时动态的加上新的行为

4、除了继承,装饰者模式也可以让我们扩展行为

5、装饰者模式意味着一群装饰者类,这些类用来包装具体组件

6、装饰者类反映出被装饰的组件类型(实际上,他们具有相同的类型,都经过接口或继承实现)

7、装饰者可以在被装饰者的行为前面或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。

8、你可以有无数个装饰者包装一个组件

9、装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。

最新文章

  1. Tomcat 部署我的第一个程序
  2. Java 性能优化之 String 篇
  3. python3 字符串与列表常用功能
  4. linux 终端报错 Out of memory: Kill process[PID] [process name] score问题分析
  5. 转载:有关qsort的使用方法和注意事项
  6. 【转载】wireshark:no interface can be used for capturing in this system with the current configuration
  7. Qt 窗口属性简介之Qt::WA_DeleteOnClose
  8. kill 命令详解 系统信号
  9. Ultra-QuickSort 分类: POJ 排序 2015-08-03 15:39 2人阅读 评论(0) 收藏
  10. 使用TypeScript开发一个在线记事本,支持离线存储
  11. Spring、Bean 的作用域
  12. 高度关注!国务院对A股发出强烈信号↓
  13. What skills are needed for machine learning jobs
  14. android头像选择(拍照,相册,裁剪)
  15. ClickOnce一项Winform部署
  16. PyCharm导入tensorflow包
  17. url分发(二级分发)
  18. git 命令常用总结
  19. 【Alpha版本】冲刺阶段——Day5
  20. 写了个脚本将json换成md

热门文章

  1. 深入理解javascript中的立即执行函数
  2. 【转】Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
  3. js产生不同的随机数
  4. linux日常管理-系统进程查看工具-ps
  5. Linux查看并修改mysql的编码
  6. HTTP之缓存首部
  7. svn merge和branch 详解
  8. 免密码ssh2登录
  9. hortonworks docker 安装
  10. Perfect service(树形dp)