装饰者模式又叫包装模式。

通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果

 
抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口可以给这些对象动态地添加职责。
 
具体组件角色:为抽象组件的实现类,是定义了一个具体的对象,也可以给这个对象添加一些职责。
 
抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。
 
具体装饰角色:为抽象装饰角色的实现类,负责具体的装饰。起到给Component添加职责的功能。
 

装饰者模式的使用场景:

  1.当我们需要为某个现有的对象,动态的增加一个新的功能或职责时,可以考虑使用装饰模式
  2.当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。

  3. 不用修改给定对象的结构就可以在外部增加附加的功能。

装饰者设计模式特点:

  1. 装饰是构造函数参数传递进行增强;
  2. 装饰模式比继承要灵活。避免了继承体系臃肿。
  3. 而且降低了类于类之间的关系。
  4. 装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。

装饰者设计模式常见对象:

抽象组件(类或者接口),充当被装饰的原始对象如下面例子中的Car.java接口;

组件具体实现类,继承实现抽象组件如下面的RunCar.java类,是我们装饰的具体对象;

抽象装饰类,通过有参构造方法或者传参数的方式来让内部有一个指向组件对象的引用,通过传递 抽象组件具体实现类来实现不同具体子类的操作,如下面的CarDecorator.java,SwimCarDecorator.java类 ;

具体抽象装饰类的实现类:如下面的FlyCarDecorator,

抽象组件角色Car.java 包含汽车的基本功能的抽象方法 run():
  1. package com.soyoungboy.example2;
    public interface Car { public void show(); public void run();
    }
具体组件角色RunCar.java 实现run():
  1. public class RunCar implements Car {
    public void run() {
    System.out.println("可以跑");
    }
    public void show() {
    this.run();
    }
    }
抽象装饰角色CarDecorator.java ,实现Car接口,提供传进来Car对象的构造方法和获取Car的getCar方法:
  1. public abstract class CarDecorator implements Car{
    private Car car; public Car getCar() {
    return car;
    }
    public void setCar(Car car) {
    this.car = car;
    }
    public CarDecorator(Car car) {
    this.car = car;
    } public abstract void show();
    }
具体装饰角色1 FlyCarDecorator.java,继承自CarDecorator,具体实现车会飞的功能,传进来的car来进行功能扩展的:
  1. public class FlyCarDecorator extends CarDecorator{
    public FlyCarDecorator(Car car) {
    super(car);
    }
    public void show() {
    this.getCar().show();
    this.fly();
    } public void fly() {
    System.out.println("可以飞");
    }
    public void run() { }
    }
具体装饰角色2 SwimCarDecorator.java 继承自CarDecorator,具体实现车会游泳的功能:
  1. public class SwimCarDecorator extends CarDecorator {
    public SwimCarDecorator(Car car) {
    super(car);
    }
    public void show() {
    this.getCar().show();
    this.swim();
    } public void swim() {
    System.out.println("可以游");
    }
    public void run() { }
    }
测试类:
  1. public class MainClass {
    public static void main(String[] args) {
    //普通的車,只能跑
    Car car = new RunCar(); car.show();
    System.out.println("---------"); //給車添加新功能,既能跑,也能游泳
    Car swimcar = new SwimCarDecorator(car);
    swimcar.show();
    System.out.println("---------"); //給車添加新功能,既能跑,也能游泳,還能飛
    Car flySwimCar = new FlyCarDecorator(swimcar);
    flySwimCar.show();
    }
    }


结果:

可以跑
---------
可以跑
可以游
---------
可以跑
可以游
可以飞

装饰者设计模式在实际开发中的使用:

1 java IO流中使用:

例如 BufferedInputStream bis = new BufferedInputStream(new FileInputStream());

2 android json数据解析的时候使用:
http://m.oschina.net/blog/408460。
 
3 android封装基础库的时候BaseActivity或者BaseFragment里面进行初始化操作的封装,比如initView(),initData(),initEvent()都是装饰者模式在android里面的具体实现。
 

设计模式--装饰者设计模式(Decorator)的更多相关文章

  1. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  2. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  3. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  4. 设计模式 - 装饰者模式(Decorator Pattern) 具体解释

    装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者 ...

  5. 大话设计模式--装饰者模式 Decorator -- C++实现实例

    1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活. 每个装饰对象的实现和如何使用这个对象分离,  每个装饰对象只关心自己的功能,不 ...

  6. C#设计模式——装饰者模式(Decorator Pattern)

    一.例子在软件开发中,我们往往会想要给某一类对象增加不同的功能.比如要给汽车增加ESP.天窗或者定速巡航.如果利用继承来实现,就需要定义无数的类,Car,ESPCar,CCSCar,SunRoofCa ...

  7. 说说设计模式~装饰器模式(Decorator)

    返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...

  8. 【设计模式】Java设计模式 - 装饰者模式

    Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...

  9. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

随机推荐

  1. js 数组常用的操作函数整理

    平时多做企业应用开发,抱着实用为主,对前端技术理解得比较肤浅,下面就是肤浅地对 js 数组的属性和方法及对它操作的 jquery 方法做些记录: js 数组是 js 内建的一个非常强大数据类型,由于 ...

  2. [ios2]发布时去除NSLog打印

    #if DEBUG #warning NSLogs will be shown #else #define NSLog(...) {} #endif

  3. php钩子程序设计

      序   作为程序员,设计出优雅而完美的系统,永远是让我们非常兴奋的事情.高手不在于你会多少语言,而在于你有多高的思想.   在设计中,怎么体现自身价值,那就是要比别人多想几步.   讲钩子程序,起 ...

  4. 正则表达式之邮箱验证javascript代码

    fuchangxi的正则: 复制代码 代码如下: /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g 开始必须是一个或者多个单词 ...

  5. SVG基础以及使用Javascript DOM操作SVG

    SVG 不依赖分辨率 支持事件处理器 最适合带有大型渲染区域的应用程序(比如谷歌地图) 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快) 不适合游戏应用 Canvas 依赖分辨率 不支持事 ...

  6. Ionic2系列——在Ionic2中使用高德地图

    之前讲过了如何在Ionic2中使用第三方库,因为第三方库必须针对TypeScript提供相应的声明文件——即d.ts文件,才能被TypeScript正确识别并编译.好在大多数的第三方库已经有了定义文件 ...

  7. 分别使用Hadoop和Spark实现二次排序

    零.序(注意本部分与标题无太大关系,可直接调至第一部分) 既然没用为啥会有序?原因不想再开一篇文章,来抒发点什么感想或者计划了,就在这里写点好了: 前些日子买了几本书,打算学习和研究大数据方面的知识, ...

  8. C#调用百度地图API

    1.打开链接http://developer.baidu.com/map/jshome.htm这里有很多DEMO,或者你直接百度搜索"百度地图API",第一个就是.进入后有很多方向 ...

  9. Docker集群实验环境布署--swarm【1 架构说明】

    在读完<Docker技术入门与实践>这本书后,基本上已对Docker了有一些入门的理解,以及我们为什么要使用Docker 答:我们发现在实际工作中,通过openstack一旦把一个VM创建 ...

  10. 卸载jdk以及重新安装jdk

    新旧交替重复安装会混乱,个人解决办法是: 1. 用系统 control panel 中 uninstall 卸载java se development kit 和 java update. 2. 打开 ...