今天呢,来给大家介绍一下装饰设计模式,java中IO就使用到了这个模式。

  装饰设计模式,顾名思义,就是对一个功能进行装饰,就跟女人化妆一样,人还是本人,但是化了妆就变得比原来更漂亮了。

  需求:当你有个功能是在N年前建立的,如今老大觉得功能不够用了,需要进行增强,那么怎么办呢?

  解决:你就可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。如果这个功能写错了,又可以把自己写的功能去掉而不影响以前的功能,是不是很灵活啊。这个类就是装饰类。

  装饰设计模式呢,主要是对一组类进行功能的增强

  那么什么时候会用到装饰模式呢?

  1.需要扩展一个类的功能,或给一个类增加附加责任

  2.需要动态的给一个对象增加功能,这些功能可以再动态的撤销

  3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实

好了,上菜了。

(由于本人比较笨,想不出什么比较恰当的例子,这里就借鉴一下http://blog.csdn.net/furongkang/article/details/7214100中的例子。什么?你说我懒? 哼,好吧,我承认我懒。)

 1 /*
 2
 3 我家里有两套房子:平房,楼房。
 4
 5 House
 6     |--PingFang
 7     |--LouFang
 8
 9 可是像我这么土豪,又具有强烈的文艺范,又有众多妻妾。。。 相信你已经感觉到了我的霸王之气。
10 所以:
11     1,对平房进行田园风光式的打造。
12     2,对楼房进行欧式风格的打造。
13 可以通过继承的方式来完成。
14
15 House
16     |--PingFang
17         |--TianYuanPingFang
18     |--LouFang
19         |--OuShiLouFang
20
21  */
22 abstract class House {
23     abstract void show();
24 }
25
26 class PingFang extends House {
27     public void show() {
28         System.out.println("平房");
29     }
30 }
31
32 class TianYuanPingFang extends PingFang {
33     public void showTianYuan() {
34         super.show();
35         System.out.println("田园风格");
36     }
37 }
38
39 class LouFang extends House {
40     public void show() {
41         System.out.println("楼房");
42     }
43 }
44
45 class OuShiLouFang extends LouFang {
46     public void showOuShi() {
47         super.show();
48         System.out.println("欧式风格");
49     }
50 }
51
52 class HouseDemo {
53     public static void main(String[] args) {
54         PingFang p = new PingFang();
55         // p.show();
56
57         TianYuanPingFang t = new TianYuanPingFang();
58         t.showTianYuan();
59
60         LouFang l = new LouFang();
61         // l.show();
62         OuShiLouFang o = new OuShiLouFang();
63         o.showOuShi();
64     }
65 }

  上面的代码实现了我需要的功能,但是如果单单为了某个功能而去继承,那么那个体系是非常臃肿的。你说感觉不出来?假如你有几百个类,那么就会需要再写上几百个子类去继承。能累死个人。

  装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。

  装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

使用装饰设计模式进行装饰:

 1 /*
 2 原体系:
 3 House
 4     |--PingFang
 5     |--LouFang
 6
 7 通过继承之后的体系
 8 House
 9     |--PingFang
10         |--TianYuanPingFang
11     |--LouFang
12         |--OuShiLouFang
13
14 无论将平房打造成田园还是欧式,都是对平房一种装修。
15 而该装修也可以用楼房。
16
17 将现将该装修定义好,需要把什么房子进行改装修,传入即可。
18 House
19     |--PingFang
20     |--LouFang
21     |--TianYuan
22     |--OuShi
23
24  */
25 abstract class House {
26     abstract void show();
27 }
28
29 class PingFang extends House {
30     public void show() {
31         System.out.println("平房");
32     }
33 }
34
35 class LouFang extends House {
36     public void show() {
37         System.out.println("楼房");
38     }
39 }
40
41 class TianYuan extends House {
42
43     private House h;
44
45     TianYuan(House h) {
46         this.h = h;
47     }
48
49     public void show() {
50         System.out.println("田园风格");
51     }
52
53     public void showTianYuan() {
54         h.show();
55         this.show();
56     }
57
58 }
59
60 class OuShi extends House {
61     private House h;
62
63     OuShi(House h) {
64         this.h = h;
65     }
66
67     public void show() {
68         System.out.println("欧式风格");
69     }
70
71     public void showOuShi() {
72         h.show();
73         this.show();
74     }
75
76 }
77
78 class HouseDemo2 {
79     public static void main(String[] args) {
80         PingFang p = new PingFang();
81         LouFang l = new LouFang();
82
83         OuShi o = new OuShi(new TianYuan(p));
84         o.showOuShi();
85
86         // TianYuan t = new TianYuan(l);
87         // t.showTianYuan();
88
89         // OuShi o = new OuShi(l);
90         // o.showOuShi();
91     }
92 }

是不是好了很多呢。

转载于:https://www.cnblogs.com/makaruila/p/4851683.html

设计模式(二)__装饰设计模式相关推荐

  1. 结构型设计模式(二) 之 装饰者模式可给对象一层层加工

    1 定义 装饰者模式(Decorator Pattern)又叫包装模式属于结构型设计模式之一,它主要用于动态地给一个对象增加一些额外扩展的功能,它是继承关系的一个替代方案,且在特定场景中比使用继承生成 ...

  2. Java设计模式——装饰模式(装饰设计模式)详解

    装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...

  3. Java设计模式(二):观察者设计模式

    1. 应用场景 某个实例的变化将影响其他多个对象. 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们. 2.概念 定义对象之间的一 ...

  4. 菜鸟柳--23种设计模式初学记录笔记(二)装饰者设计模式

    package DecoratorMethod; /*优点: 可以实现不同要素类之间的排列组合 缺点: 要素类可以随机组合,容易获取违反业务逻辑的组合 扩展: 继承可以对某个方法进行功能增强,装饰设计 ...

  5. 二十三种设计模式-六大原则

    二十三种设计模式 一.创建型: 单例模式.工厂模式.抽象工厂模式.原型模式.建造者模式: 二.结构型: 代理模式,装饰器模式.适配器模式.外观模式.组合模式.享元模式.桥梁模式: 三.行为型: 策略模 ...

  6. 黑马程序员:java基础之装饰设计模式

    一.什么是装饰设计模式 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类. 装饰类通常会通过构造方法,传递进来一个需要装饰的对象, ...

  7. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  8. 装饰设计模式缓冲流转换流序列化与反序列化

    装饰设计模式&缓冲流&转换流&序列化与反序列化 - 能够使用字节缓冲流读取数据到程序1.创建BufferedInputStream对象,构造方法中传递FileInputStre ...

  9. 深入理解常见的二十三种设计模式

    深入理解常见的二十三种设计模式 文章目录 深入理解常见的二十三种设计模式 一.设计模式的分类 1.1 创建型(五种) 1.2 结构型(七种) 1.3 行为型(十一种) 二.创建型 2.1 单例模式 2 ...

最新文章

  1. 鸿蒙系统tee内核,厉害!鸿蒙内核的技术定位,是赶第三代微内核的潮流
  2. HEAD detached from XXXX解决方法
  3. chrome浏览器下“多余”的2px
  4. UVA11549计算器谜题
  5. linux命令行ps1变量_利用Shell中变量PS1定制Linux Shell命令主提示符
  6. python写一个文件下载器_python使用tcp实现一个简单的下载器
  7. mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)
  8. 外卖小哥是怎样炼成的?
  9. linux内容对齐的快捷键,linux第一波命令总结
  10. Error:Cannot find bean: org.apache.struts.taglib.html.BEAN in any scope
  11. 模仿showModalDialog的总在最前
  12. 手把手教你安装Sketch破解版和measure插件
  13. Navicat获取注册码
  14. 酷派手机锁屏壁纸提取
  15. Redis主从复制原理
  16. C语言实现lagrange theorem拉格朗日定理的算法(附完整源码)
  17. matlab画柱状图函数,series函数做柱状图
  18. 关于域名备案后的注意事项,血淋淋的教训
  19. git lfs官网翻译
  20. Win7 开机优化系列-上篇

热门文章

  1. mysql 修改max_connections
  2. SQL compute by 的使用
  3. win8.1配置java环境个人 win8.1
  4. 解决计算机名修改或作业移植导致的服务器名问题.sql
  5. VC的包含文件和引用文件是不一样的~
  6. php 的包管理,php composer包管理器
  7. OVS datapath简介(十八)
  8. leetcode算法题--划分为k个相等的子集★
  9. 学生选课管理系统c语言程序报告,c语言课程设计学生选课管理系统实验报告.doc...
  10. mac下java配置填坑