在购买了一个房子后,如果是毛坯房,肯定不合适直接入住的。需要对它进行装修:地面找平贴地砖、批墙贴墙纸、吊顶装订以及买需要的家具,住进去以后也可能根据需要再添加或者去掉一些家具或者修改一些东西。所以的这一切,都是为了住起来舒服,也就是更好试用这个房子。这个装修过程,基本上就是装饰模式需要做的事情。

  引申到软件方面,一个原有的功能,可能需要添加一些辅助功能才能更好的应用。为了更好的、更加灵活的处理这样的需要,根据日常针对此类功能很好的设计写法进行了抽象。看起来就是对原来的功能进行了一些包装一样。搞明白装饰模式要解决的问题场景后。我们先来看下这个模式的定义:

动态的给动向添加一些额外的职责,就添加功能来说,装饰模式比生成子类更加灵活。

类图和组成元素

                                                

(抽象组件类)Component:定义一个对象接口,可以给这个对象动态的添加职责;

(具体组件类)ConreteComonent:定义一个对象,可以给这个对象添加职责。被装饰的原始类

(抽象装饰着)Derocater:定义一个接口,并且继承 Component,而且拥有一个 Component 类型的属性。

(具体装饰着)ConcreteDerocater:是具体的装饰着,也可以作为被装饰者来装饰。

示例

为了更好的展示装饰模式的。这里举个例子加深理解。给一个警察添加装备来举例。一般都配置警棍,但是根据每次执行任务的不同,来配置相应的装备,看例子

//警察  相当于 Component
public interface Jingcha {
public void addZhuangb();
} //特警 相当于 ConcreteComponent
public class TeJing implements Jingcha { @Override
public void addZhuangb() {
// TODO Auto-generated method stub
System.out.println("警棍");
}
} //特警 相当于 ConcreteComponent 被装饰的原始类
public class TeJing implements Jingcha { @Override
public void addZhuangb() {
// TODO Auto-generated method stub
System.out.println("警棍");
}
} //装饰警察 相当于 Decorate,抽象的装饰器类
public abstract class DecorateJingcha implements Jingcha { Jingcha jc = null;
public DecorateJingcha(Jingcha jc){
this.jc = jc;
} @Override
public abstract void addZhuangb();
} //装饰类之一
public class DecorateJingchaFDY extends DecorateJingcha { public DecorateJingchaFDY(Jingcha jc) {
super(jc);
// TODO Auto-generated constructor stub
} @Override
public void addZhuangb() {
// TODO Auto-generated method stub
jc.addZhuangb();
System.out.println("防弹衣");
} } //装饰类之一
public class DecorateJingchaSQ extends DecorateJingcha { public DecorateJingchaSQ(Jingcha jc) {
super(jc);
// TODO Auto-generated constructor stub
} @Override
public void addZhuangb() {
// TODO Auto-generated method stub
jc.addZhuangb();
System.out.println("手枪");
} } //装饰类之一
public class DecorateJingchaYSY extends DecorateJingcha { public DecorateJingchaYSY(Jingcha jc) {
super(jc);
// TODO Auto-generated constructor stub
} @Override
public void addZhuangb() {
// TODO Auto-generated method stub
jc.addZhuangb();
System.out.println("夜视仪");
}
}
 public class Client {
public static void main(String[] args) {
Jingcha jc = new TeJing();
//维护抗议游行秩序,只用警棍就可以
System.out.println("------维护抗议游行秩序,只用警棍就可以-------");
jc.addZhuangb();
//晚上维护抗议游行秩序
System.out.println("------晚上维护抗议游行秩序,需另外加上夜视仪-------");
DecorateJingcha yesy = new DecorateJingchaYSY(jc);
yesy.addZhuangb();
//处理恐怖袭击事件
System.out.println("------处理晚上恐怖袭击事件,要枪、防弹衣-------");
DecorateJingcha dch1 = new DecorateJingchaSQ(jc);
DecorateJingcha dch2 = new DecorateJingchaFDY(dch1);
dch2.addZhuangb();
}
} -----------------------------执行效果------------------------------------
------维护抗议游行秩序,只用警棍就可以-------
警棍
------晚上维护抗议游行秩序,需另外加上夜视仪-------
警棍
夜视仪
------处理晚上恐怖袭击事件,要枪、防弹衣-------
警棍
手枪
防弹衣

 通过例子看出来,装饰器模式可以很灵活的实现需要的功能。而且符合开闭原则。

分析此模式

   首先分析一下实现方面需要注意什么呢:

     一、装饰器类和被装饰器都是实现共同的接口,这样有个好处是装饰类也能作为被装饰类来进一步装饰。

二、装饰器类和被装饰类除了要实现共同的接口外,装饰器类还应该有共同的接口。这里主要是引入被装饰的类所谓属性

三、根据定义可以看出来,此模式比继承灵活。这主要体现在试用的是类的组合方式来调用。和继承比起来不用全部继承过来。

四,装饰器一次尽量少实现功能。这样在调用的时候组合起来更加灵活。

这个模式的有点是什么呢.? 比继承更加灵活;更加容易复用功能;简单继承关系,简化搞定类的定义。原始类虽然被装饰了,但是它本身并没有被该表,只是在类的外部进行修改。也有点类似给原始类加上了一些外壳。

  每个模式的出现都有一定的目的,这个模式的目的是什么?就是根据业务灵活组合对象,复用已有类实现功能需要。也可以理解为把有些复杂的功能简单化,分散化,运行时根据需要来组合使用。

代理模式和这个模式在实现上非常的相似,这个在写代理模式的时候再详细分析下。装饰模式就写到这里了

设计模式之(十)装饰模式(DECORATOR)的更多相关文章

  1. 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 《JAVA设计模式》之装饰模式(Decorator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  3. 设计模式系列之装饰模式(Decorator Pattern)

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...

  4. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...

  5. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

    原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...

  6. 设计模式 装饰模式(Decorator)

    设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...

  7. 设计模式-装饰模式(Decorator Pattern)

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

  8. 设计模式-09装饰模式(Decorator Pattern)

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

  9. 《Java设计模式》之装饰模式

    装饰模式(Decorator) 1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.   ...

  10. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

随机推荐

  1. 查找字段的筛选-使用addCustomView

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复231或者20161031可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  2. 什么是POSP?系统逻辑是什么?pos收单必读

    POSProxy,POS前置系统.主要用于管理前端的POS机具和交易的转发,具体功能有:   1. POS机具的密钥及下载管理:   2. 交易的合法检测和过滤:   3. 交易监控和分流:   4. ...

  3. Vue实战狗尾草博客管理平台第四章

    本章主要内容如下: 填补上期的坑. iconfont仓库的关联,引入. 开发登录页面 填坑 上期中我们功能都已正常使用.但不知道有没有小伙伴测试过error页面,当访问地址不存在时,路由是否能正常挑战 ...

  4. [b0032] python 归纳 (十七)_线程同步_信号量Semaphore

    代码: # -*- coding: utf-8 -*- """ 多线程并发同步 ,使用信号量threading.Semaphore 逻辑: 多个线程,对同一个共享变量 , ...

  5. [视频教程] 基于redis的消息队列实现与思考

    使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它.在公司项目中正好有个场景使用到了消息队列,因此就来说一下流程.在web界面上有个功能是群发邮 ...

  6. 4-8 pie与布局

    In [1]: %matplotlib inline import matplotlib.pyplot as plt   1.pie简单参数:plt.pie(x, explode=None, labe ...

  7. 如何将MagicaVoxel模型导入UE4中(1)

    前言 当初在选择自己项目的美术风格时,由于自己的美术基础实在是太差,所以选择了体素风格来构建(其实还是MagicaVoxel的建模操作很容易上手),但是将自己千辛万苦做好的模型导入至项目中时,出现了这 ...

  8. 第一周-调用weka算法进行数据挖掘

    第一周-调用weka算法进行数据挖掘 简单数据集data.txt @relation weather @attribute outlook {sunny, overcast, rainy} @attr ...

  9. python 生成sql语句

    1. 别名 s = '' name = ['张三', '李四', '王五'] for i in range(len(name)): s += "'" + name[i] + &qu ...

  10. php 学习笔记之关于时区的那点事

    科普一下什么是时区 众所周知,地球绕着太阳转的同时也会自转,因此同一时刻不同地区所接收到太阳照射的情况不同,所以有的地区是日出,有的地区是日落,还有的地区可能是黑夜. 既然地球上的不同地区时间不同,那 ...