文档章节

小菜学设计模式——装饰模式

learn_more
 learn_more
发布于 2015/06/05 09:52
字数 1165
阅读 121
收藏 4
点赞 0
评论 0

背景

    很多时候你会发现子类在不断增加,有时候甚至难以控制,虽然继承是面向对象的一大特征,但是继承并不是项目中所提倡,合成复用设计原则就告诉我们能够使用合成的地方尽量不要使用继承。对于继承来说还有一个很大的缺点,那就是内存占用与子类的层次是成正比关系的,这个也很好理解,实例化子类的时候总是要先调用最顶层父类的构造方法,然后依次调用低层次的父类直到自身初始化,这个过程实际上是很耗内存的。那么,问题就来了,我们经常会扩展一个类的某个方法,是不是没扩展方法都有必要新增一个子类呢?答案是否定的,在某种情况下我们可以采用装饰模式很好的避免子类的泛滥。

1、使用意图

    避免过多的子类,动态添加职责

2、生活实例

    装饰模式用在穿衣服身上在好不过了,如果把穿袜子、穿裙子、穿短裤 看成是一个人打扮方法的不同实现话,那么是不是可以采用继承呢?如果想要动态控制动作的顺序和动作的个数那么,可能有 6+3+3 = 12 个子类;这个时候如果采用装饰模式,把每一个动作都分离作为最原子的操作,然后,对于动作个数和动作顺序通过顺序添加这些原子动作来完成,那么,只需要3个类就能完成。

3、Java 例子(框架、JDK 、JEE)

      Java IO流的控制,字节流到字符流的过程 ,就是一个典型的装饰模式,不过IO流的特点似乎没有把装饰模式发挥得淋漓尽致,因为字符流可以装饰字节流,但是字节流貌似装饰不了字节流,也就是在顺序上没有使用到装饰模式,只是在动作的个数上使用了装饰模式。

4、模式类图

    

5、模式理解和优点

    需要把所需的功能按正确的顺序串联起来进行控制,然而这些动作都是同一类型的时候,可以使用装饰模式;

    装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

    Component是一个动作的抽象接口,ConcreteComponent 其实是一个最上层的装饰角色,换句话说所有的装饰都是基于他的,比如人穿衣服这个装饰过程,ConcreteComponent 应该是初始化接收具体哪个人,而后面装饰时则对人穿衣服的动作进行装饰。也就是ConcreteDecorator可以接收ConcreteComponent 和 ConcreteDecorator 进行装饰。很好的例子就是Java IO流中有个FileInputStream,不管后面如何缓冲或者字符流装饰,都必须先用FileInputStream初始化一个File对象。

    装饰模式中ConcreteComponent有些时候并不是总是必须的,有些时候可以省去ConcreteComponent ,而直接只有装饰对象,这样其实也很好理解。

    每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到装饰链中。

    装饰模式是为已有的功能添加更多的功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新家的代码通常了装饰了原有类的核心职责或主要行为。

    装饰模式的原理是:他把每个要装饰的功能放在单独的类中,并让这个类包装他所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。

6、与类似模式比较

    这个模式最主要的优点就是减少子类的泛滥。

    这个设计模式和下一个设计模式:代理模式 很相似,具体哪些相似,就在代理模式那里总结了。


© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 90
博文 240
码字总数 210196
作品 0
深圳
程序员
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0
ES7 Decorator 装饰者模式

原作者:玄农 装饰模式 设计模式大家都有了解,网上有很多系列教程,比如 JS设计模式等等。 这里只分享 装饰者模式 以及在 如何使用 ES7 的 概念 装饰模式 v.s. 适配器模式 装饰模式和适配器...

_朴灵_
05/14
0
0
策略模式Strategy、装饰模式Decorator

策略模式Strategy 定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略模式的重心不是如何实现算法,而是如何组织、调用...

Sandy_wu
2013/05/03
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
05/26
0
0
小菜学设计模式——工厂方法模式

背景 简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。如果,项目需要扩展,新增一种产品需要简...

learn_more
2015/06/07
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
小菜学设计模式——抽象工厂模式

背景 简单工厂、工厂方法模式,接着必须学习抽象工厂模式 1、使用意图 扩展工厂方法模式 2、生活实例 淘宝电影、猫眼电影都能为我们生成当天各种电影票 3、Java 例子(框架、JDK 、JEE) 个人...

learn_more
2015/06/13
0
0
我的Java设计模式-代理模式

写完上一篇之后有小伙伴问我有没有写过代理模式,想看看我的理解。原本我的设计模式系列是按照创建型-行为型-结构型的顺序写下去的,既然小伙伴诚心诚意了,我就大发慈悲的穿插一篇代理模式。...

Jet啟思
2017/11/29
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6用的外库遇到的问题

要用到wmi库 pip install wmi 装后不能用还要安装pywin32库。 要用到crypto加密模块安装pip instal pycrypto装后不能用。要安装pycryptodome。...

oisan_
4分钟前
0
0
select, poll, epoll I/O复用介绍

什么是I/O复用? 内核监视多个文件描述符(I/O文件句柄),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。 I/O多路复用又被称为“事件驱动”(比如读写事...

xiaoxlm
4分钟前
0
0
【Spring 系列 给IOC容器添加组件的几种方式总结】

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。 1、Spring 中给IOC容器添加组件的几种方式 在Spring的配置文件中,配置Bean(基于XML方式...

HansonReal
5分钟前
2
0
bootstrapTable语言包设置

###方法一引入不同的语言包 <script src="bootstrap-table-zh-CN.js"></script> ###方法二引入全语言包 <script src="bootstrap-table-locale-all.min.js"></script>//然后在初始化前设计默......

momo1987
6分钟前
0
0
Saltstack 常用命令

1、拷贝文件到客户端 # salt 'slaver.test.com' cp.get_file salt://apache.sls /tmp/cp.txt 2、拷贝目录到客户端 # salt 'slaver.test.com' cp.get_dir salt://test /tmp 3、显示存活的客户......

硅谷课堂
7分钟前
0
0
致初学者-如何学好Python这门编程语言?[图]

致初学者-如何学好Python这门编程语言?[图]: 对于很多Python3初学者,往往会面临以下问题:Python2和Python3我该学习哪一个?是否要安装Linux系统学习Python?Python3有各种版本我该安装哪...

原创小博客
10分钟前
1
0
E31---setopt=protected_multilib=false

今天在云服务器上装nginx,需要先安装一些依赖库比如zlib, ,但是安装zlib时候报错。 yum install -y zlib zlib-devel 1 (-y 指的是如果需要选yes no的自动y)下面是报错 Protected multil...

侠客行之石头
14分钟前
0
0
HTTP常见面试题

Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,H...

JK_OPERA
15分钟前
0
0
python爬取站长素材网页图片保存到ppt中

网站地址:http://sc.chinaz.com/tupian/index.html 直接上代码: import requestsfrom bs4 import BeautifulSoupfrom pptx import Presentationfrom pptx.util import Inchesimpor......

你为什么不吃药
17分钟前
1
0
Ubuntu 18.04 swap空间的修改

一、准备工作 执行“sudo swapon -s”命令,查看是否已经存在swap file 二、修改swap file # 如果第一步存在swapfile则需要先禁用sudo swapoff /swapfile# 修改swap 空间的大小为2Gs...

Iceberg_XTY
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部