意图:

动态地给一个对象添加一些额外的职责。就增加功能来说,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. HUD1455:Sticks

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. 【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图

    目录(?)[-] Debug视图 DDMS视图 查看应用运行状态 进入debug状态 HPROF Thread信息 Method信息 Stop 截图 UI层次架构信息 其它的 Tab中提供的功能 我们 ...

  3. Linux keepalived与lvs的深入分析

    一)概述 在本篇文章里,我们会涉及两部份内容,一个是LVS,另一个则是keepalived. 即我们用LVS和keepalived实现了负载均衡及高可用的服务器.   LVS有实现三种IP负载均衡技术 ...

  4. 人物-IT-马化腾:马化腾

    ylbtech-人物-IT-马化腾:马化腾 马化腾,1971年10月29日生于原广东省海南岛东方市八所港(今海南省东方市),祖籍广东省汕头市.腾讯公司主要创办人之一.现任腾讯公司董事会主席兼首席执行官 ...

  5. Python-实现socket简单地连续发数据

    只需用while条件判断来实现 服务器端 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import socket serv ...

  6. python 爬虫 之BeautifulSoup

    BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. ...

  7. BIOS MCSDK 2.0 User Guide - Acronyms and Definitions

    BIOS MCSDK 2.0 User Guide - Texas Instruments Wiki Acronyms and Definitions The following acronyms a ...

  8. 0010_while循环

    while 条件: 代码块 break:跳出循环语句 continue:跳出本次循环,进入下一次循环. __author__ = 'qq593' #!/usr/bin/env python #-*- ...

  9. CentOS 7 破解mariadb密码

    1.停止mariadb服务: systemctl stop mariadb 2.进入单用户模式: mysqld_safe  --skip-grant-tables & 3.切换到另外一个工作组 ...

  10. Statement, PreparedStatement和CallableStatement的区别

    Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行SQL豫剧时,数据库都要编译该SQL语句. Satatement stmt = conn.getStatement() ...