Java文件与io——装饰者模式
意图:
动态地给一个对象添加一些额外的职责。就增加功能来说,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、装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
Java文件与io——装饰者模式的更多相关文章
- JAVA设计模式之【装饰者模式】
JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...
- [转载]Java中继承、装饰者模式和代理模式的区别
[转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...
- Java IO 装饰者模式
装饰模式(Decorator) 装饰模式又名包装(Wrapper)模式. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的 ...
- Java 的设计模式之一装饰者模式
刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- java进阶系列之装饰器模式
1.介绍 装饰器模式顾名思义就是装饰某个对象的,是一种结构型模式.装饰器模式允许向一个现有对象添加新的功能,同时不改变其结构,用户可以随意的扩展原有的对象.它是作为现有的类的一个包装.装饰器模式一方面 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- java I/O之装饰者模式
装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...
- JAVA设计模式初探之装饰者模式
定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种 ...
随机推荐
- MongoDB分析工具之一:explain()语句分析工具
explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mongo ...
- 前端框架:template
ylbtech-前端框架: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech.cn ...
- html锚链接
锚点(anchor):其实就是超链接的一种,一种特殊的超链接 普通的超链接,<a href="路径"></a> 是跳转到不同的页面 而锚点,<a hr ...
- 什么是Nginx?为什么使用Nginx?
源自 https://blog.csdn.net/yougoule/article/details/78186138 一.前言 为毛要用nginx服务器代理,不直接用tomcat 7.0,还 ...
- 线程中event.wait() event_obj.set() 的使用
#!/usr/bin/env python import threading # event.wait()##阻断线程向下执行 event_obj.set()#释放进程向下执行 def do(even ...
- socket消息发送
expressClient.html <html><head><meta http-equiv="Content-Type" content=&quo ...
- Ganglia 安装 for centos6.5
环境: centos6.5x64 ,cdh5.1.0 三个节点: c1:gmeta gmond(gmeta类似于namenode,gmond 相当于datanode)主节点 c2: gmond (相当 ...
- 6、git和github
参考:http://www.cnblogs.com/qianmojing/p/6484162.htmlhttp://www.jb51.net/article/70729.htmhttp://www.c ...
- Luogu 4317 花神的数论题
披着数论题外衣的数位dp. 相当于数一数$[1,n]$范围内$1$的个数是$1,2,3,4,...log(n)$的数各有多少个,直接在二进制下数位dp. 然而我比较sb地把(1e7 + 7)当成了质数 ...
- Umbraco Examine Search (Lucene.net) french accent
在项目中使用Umbraco examine search 来search 法语网站时,客户有一个需求,就是 当search expérience 和 experience 时,需要返回一样的结果. ...