文档章节

Decorator装饰模式

ruyees
 ruyees
发布于 2014/10/05 11:47
字数 456
阅读 5
收藏 0
点赞 0
评论 0

Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。继承为类型引入的静态特质的意思是说以继承的方式使某一类型要获得功能是在编译时。所谓静态,是指在编译时;动态,是指在运行时。

GoF《设计模式》中说道:动态的给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。

下面来看看Decorator模式的结构:

 

 

 

看这个结构好像不是很明白,下面我根据代码讲解一下这个结构。我想了一个场景:我们现在用的手机功能很多,我就用Decorator模式实现一下对某个手机的GSP和蓝牙功能扩展。

首先,我们需要一个手机的接口或者是抽象类,我这里就用抽象类来实现,代码如下:

 

 

package decorator_phone;

public abstract class AbstractCellPhone {
	public abstract String CallNumber();
    public abstract String SendMessage();
}

 

 

AbstractCellPhone也就是结构图中的Component,然后,我再来实现NokiaMoto的手机类,这类要继承AbstractCellPhone,也就是图中ConcreteComponent类要继承Component,实现代码如下:

 

 

package decorator_phone;

public class NokiaPhone extends AbstractCellPhone {

	public String CallNumber() {
		return "NokiaPhone call sombody";
	}

	public String SendMessage() {
		return "NokiaPhone send a message to somebody";
	}
}

 

package decorator_phone;

public class MotoPhone extends AbstractCellPhone {

	public String CallNumber() {
		return "MotoPhone call sombody";
	}

	public String SendMessage() {
		return "MotoPhone send a message to somebody";
	}
}

 

 

接下来我需要一个Decorator接口或者抽象类,实现代码如下:

© 著作权归作者所有

共有 人打赏支持
ruyees
粉丝 3
博文 71
码字总数 0
作品 0
深圳
产品经理
设计模式-装饰模式

模式定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 模式结构 Component:组件对象的接口,可以给这些对象动态地增加职责。ConcreteComponet:具体的...

wjk_snail ⋅ 2016/03/23 ⋅ 0

【设计模式】——装饰者模式

装饰模式概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为,在现实生活中,这种情况也到处存在,例如一张照片,我们可以不改变照片本身,给它增加一个相框,使得它...

u013043341 ⋅ 2017/07/16 ⋅ 0

设计模式--装饰模式

装饰模式(decorator,别名Wrapper): 装饰器模式的应用场景: 装饰器模式的缺点: 示例: 装饰者模式测试类GirlDecoratorTest.java 描述接口类Description.java 中国女孩类(被装饰类)Chinese...

有钱有爱 ⋅ 2016/04/08 ⋅ 0

JAVA 设计模式 --- 装饰者模式

装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责。是一种结构式模式,就增加功能来说,Decorator 模式相比生成子类更为灵活。换言之,客户端并不会觉得对象在装饰前和装饰后有什...

pan_1308 ⋅ 2016/10/19 ⋅ 0

装饰模式(Decorator)

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator...

Carbenson ⋅ 2015/09/01 ⋅ 0

sitemesh自学整理

这两天自学了一下sitemesh,从网上找了些资源,自己又整理一下,做了个小例子,记下来吧,呵呵;各位牛人大哥,也帮忙看看,要是小弟走弯路了及时把我拉回来 ,O(∩_∩)O~ 简单介绍一下sitem...

Anterior ⋅ 2011/07/13 ⋅ 1

转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客《python中decorator详解》 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器——decorator。 python中的函数即objects...

laugh2last ⋅ 2015/08/17 ⋅ 0

设计模式(结构型模式)——装饰模式(Decorator)

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator...

小风89 ⋅ 2016/07/19 ⋅ 0

设计模式 – 装饰模式(Decorator)

问 题的提出:一个人装扮,可以先穿裤子,再穿衣服,再穿鞋子;也可以先穿衣服,再是裤子,再是鞋子,由于裤子、衣服、鞋子种类很多,故搭配种类就更多了。又 如制作蛋糕,鲜奶油蛋糕、草莓蛋...

lovedreamland ⋅ 2011/02/10 ⋅ 0

【python学习笔记】装饰器、functools.wraps装饰器和functools.partial偏函数

1、装饰器 不修改被装饰函数的定义,但是可以在代码运行期间动态增加功能的方式,称之为“装饰器“, 本质上,装饰器decorator就是一个返回函数的高阶函数 运行效果: 2、内置的functools.w...

Master_Li ⋅ 2016/09/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

猫耳m ⋅ 21分钟前 ⋅ 0

SpringMVC中的ContentNegotiatingViewResolver配置

pom.xml <properties><commons-lang.version>2.6</commons-lang.version><slf4j.version>1.7.6</slf4j.version><spring.version>4.1.3.RELEASE</spring.version> <jack......

颖伙虫 ⋅ 24分钟前 ⋅ 0

Spring Boot 2.0正式发布,升还是不升呢?

Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验。在现代企业级应用架构中,Spring技术栈几乎成为...

java高级架构牛人 ⋅ 24分钟前 ⋅ 0

打包时隐藏打印日志

1.打包时不允许项目中有打印的日志,可以在pch中加入下面这段代码即可 #ifdef DEBUG# define Log(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA...

小黑202 ⋅ 26分钟前 ⋅ 0

SSL双向认证的实现

环境 系统:archlinux/centOS nginx:nginx/1.12.2 浏览器:火狐firefox 前提:1.安装nginx。    2.安装openssl。 生成证书 新建工作目录  首先建立一个工作目录,这里以我的工作目录为例...

颖辉小居 ⋅ 31分钟前 ⋅ 0

vscode 代码格式化,语法检查插件ESLint+Prettier

ESLint+Prettier prettier只关注格式化 ,插件prettier-vscode,编辑器的配置setting.json会出现prettier插件的相关配置节点,同时也能看到一些默认的配置信息。 安装成功后,编辑器默认的格式...

momo1987 ⋅ 34分钟前 ⋅ 0

使用TinyProxy搭建代理服务器

什么是TinyProxy 它是一个代理服务器,用来实现http或https代理,windows系统一直在用ccproxy, 非windows系统,怎么开放个http代理呢?那就是TinyProxy。 安装 直接执行命令即可 sudo apt-g...

bengozhong ⋅ 34分钟前 ⋅ 0

掌握需求过程

1,需求必须可度量、可测试 2,需求是什么? 功能需求 非功能需求 限制条件 3,Volere需求过程 采用Volere需求过程,最好采用RUP,增量,迭代,螺旋,Scrum或其他类似的迭代式开发过程 (注意...

霜叶情 ⋅ 38分钟前 ⋅ 0

分布式微服务云架构开发Web应用

举一个简单的例子,在快速入门工程的基础上,举一个简单的示例来通过Thymeleaf渲染一个页面。 @Controller public class HelloController { @RequestMapping("/") pub...

明理萝 ⋅ 40分钟前 ⋅ 0

图应用之关键路径(Critical Path)

之前我们介绍过,在一个工程中我们关心两个问题: (1)工程是否顺利进行 (2)整个工程最短时间。 之前我们优先关心的是顶点(AOV),同样我们也可以优先关心边(同理有AOE)。(Activity ...

临江仙卜算子 ⋅ 41分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部