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模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种 ...
随机推荐
- JavaScript-Tool-富文本:UEditor
ylbtech-JavaScript-Tool-富文本:UEditor UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点.开源基于BSD协 ...
- popup的简单应用举例
一.首先说一下自执行函数 1. 立即执行函数是什么?也就是匿名函数 立即执行函数就是 声明一个匿名函数 马上调用这个匿名函数 2.popup的举例 点击,弹出一个新的窗口.保存完事,页面不刷新数据就返 ...
- C++零碎知识点(一)
1.sizeof用法总结 ①与strlen比较 strlen 计算字符数组的字符数,以"\0"为结束判断,但不包括. sizeof 计算数据(数组.变量.类型.结构 ...
- fabric自动化安装mysql-server
1.创建文件auto_install_mysql.py vim auto_install_mysql.py --------------------------------------------&g ...
- display与position之间的关系
以防自己忘记写的 网上找的 positon 与 display 的相互关系 元素分为内联元素和区块元素两类(当然也有其它的),在内联元素中有个非常重要的常识,即内两元素是不可以设置区块元素所具有的样式 ...
- linux 安装输入法
简述 Ubuntu16.04安装完后,和12.04以及14.04都不一样,并没有中文输入功能.于是搜索一些安装中文输入法的方法. 开始安装了ibus pinyin输入法,但是系统重启之后发现有些时候不 ...
- Centos6.8下yum安装python2.7
下载 ius-release.rpm包 wget https://centos6.iuscommunity.org/ius-release.rpm 安装ius-release.rpm包 rpm -Uv ...
- oracle中文乱码解决方法笔记
我刚刚在linux下安装oracle时就碰到这个问题,查了半天知道问题是oracle的字符集不对. 解决方法是dbca进入图形界面,删去现有的库,重建新库. 建库时注意: 1,dbca创建, 选第一项 ...
- win7 64位安装nokia 920驱动
折腾了很长时间,终于安装成功,先将一些步骤记下来,此方法适用于哪些网上常规方法无法安装驱动的: 需要注意920不要连到电脑上的USB3.0接口,相关文件下载地址:http://pan.baidu.co ...
- hdu1086
#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#inc ...