意图:

动态地给一个对象添加一些额外的职责。就增加功能来说,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——装饰者模式的更多相关文章

  1. JAVA设计模式之【装饰者模式】

    JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...

  2. [转载]Java中继承、装饰者模式和代理模式的区别

    [转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...

  3. Java IO 装饰者模式

    装饰模式(Decorator) 装饰模式又名包装(Wrapper)模式. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的 ...

  4. Java 的设计模式之一装饰者模式

    刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...

  5. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  6. java进阶系列之装饰器模式

    1.介绍 装饰器模式顾名思义就是装饰某个对象的,是一种结构型模式.装饰器模式允许向一个现有对象添加新的功能,同时不改变其结构,用户可以随意的扩展原有的对象.它是作为现有的类的一个包装.装饰器模式一方面 ...

  7. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  8. java I/O之装饰者模式

    装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...

  9. JAVA设计模式初探之装饰者模式

    定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种 ...

随机推荐

  1. 排成一行的li之间的间隙问题

    现象 对于ul下li排成一行的布局(即li的display由list-item设为inline-block): 情况1 如果这些li在书写的时候有换行或者有空格,且ul本身的font-size不为0, ...

  2. python构造一个http请求

    我们经常会用python来进行抓包,模拟登陆等等, 势必要构造http请求包. http的request通常有4个方法get,post,put,delete,分别对应于查询,更新,添加,删除.我们经常 ...

  3. java基础知识(2)---语法基础

    二:java语法基础: 1,关键字:其实就是某种语言赋予了特殊含义的单词. 保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词. 2,标示符:其实就是在程序中自定义的名词.比如类名,变量名 ...

  4. VisualGDB系列5:使用VS来开发Linux程序

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文演示如何使用VS来构建和调试Linu ...

  5. C++之queue模板类

    1.queue常用成员函数 ①size() 返回队列中元素的个数 ②empty() 如果队列空则返回真  ③back() 返回最后一个元素引用即队尾. ④front() 返回第一个元素引用即队首. ⑤ ...

  6. [bzoj2038]莫队算法学习

    解题关键:莫队最重要的是区间之间以$O(1)$的复杂度进行转化,由于电脑原因,后续补上公式推导. #include<cstdio> #include<cstring> #inc ...

  7. hbase exporter importer 导出 导入

    导出: bin/hbase org.apache.hadoop.hbase.mapreduce.Export bigtable /user/bigtable_bak/ 导入: bin/hbase or ...

  8. Ubuntu 12.04 LTS为例演示vsftpd虚拟用户 的配置

    vsftpd虚拟用户   2012-05-19 15:46:59|  分类: GNU/Linux |  标签:ubuntu  vsftpd  ftp  虚拟用户  |举报|字号 订阅 我们登录FTP有 ...

  9. 6、perl创建模块(Exporter)及路径 引用 嵌套 查询模块

    参考博客:http://www.cnblogs.com/xudongliang/tag/perl/ 1.perl 模块的创建以及制定perl 模块的路径 (1)创建一个Myfun.pm模块. #/us ...

  10. 【转】lucene4.3.0 配置与调试

    lucene4.3.0 配置与调试 demo lucene的最新版本是4.3.0, http://www.apache.org/dyn/closer.cgi/lucene/java/4.3.0 luc ...