设计模式(二)__装饰设计模式
今天呢,来给大家介绍一下装饰设计模式,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 定义 装饰者模式(Decorator Pattern)又叫包装模式属于结构型设计模式之一,它主要用于动态地给一个对象增加一些额外扩展的功能,它是继承关系的一个替代方案,且在特定场景中比使用继承生成 ...
- Java设计模式——装饰模式(装饰设计模式)详解
装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式. 装饰(Decorator)模式 ...
- Java设计模式(二):观察者设计模式
1. 应用场景 某个实例的变化将影响其他多个对象. 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们. 2.概念 定义对象之间的一 ...
- 菜鸟柳--23种设计模式初学记录笔记(二)装饰者设计模式
package DecoratorMethod; /*优点: 可以实现不同要素类之间的排列组合 缺点: 要素类可以随机组合,容易获取违反业务逻辑的组合 扩展: 继承可以对某个方法进行功能增强,装饰设计 ...
- 二十三种设计模式-六大原则
二十三种设计模式 一.创建型: 单例模式.工厂模式.抽象工厂模式.原型模式.建造者模式: 二.结构型: 代理模式,装饰器模式.适配器模式.外观模式.组合模式.享元模式.桥梁模式: 三.行为型: 策略模 ...
- 黑马程序员:java基础之装饰设计模式
一.什么是装饰设计模式 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类. 装饰类通常会通过构造方法,传递进来一个需要装饰的对象, ...
- 【白话设计模式二十二】解释器模式(Interpreter)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 装饰设计模式缓冲流转换流序列化与反序列化
装饰设计模式&缓冲流&转换流&序列化与反序列化 - 能够使用字节缓冲流读取数据到程序1.创建BufferedInputStream对象,构造方法中传递FileInputStre ...
- 深入理解常见的二十三种设计模式
深入理解常见的二十三种设计模式 文章目录 深入理解常见的二十三种设计模式 一.设计模式的分类 1.1 创建型(五种) 1.2 结构型(七种) 1.3 行为型(十一种) 二.创建型 2.1 单例模式 2 ...
最新文章
- 鸿蒙系统tee内核,厉害!鸿蒙内核的技术定位,是赶第三代微内核的潮流
- HEAD detached from XXXX解决方法
- chrome浏览器下“多余”的2px
- UVA11549计算器谜题
- linux命令行ps1变量_利用Shell中变量PS1定制Linux Shell命令主提示符
- python写一个文件下载器_python使用tcp实现一个简单的下载器
- mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)
- 外卖小哥是怎样炼成的?
- linux内容对齐的快捷键,linux第一波命令总结
- Error:Cannot find bean: org.apache.struts.taglib.html.BEAN in any scope
- 模仿showModalDialog的总在最前
- 手把手教你安装Sketch破解版和measure插件
- Navicat获取注册码
- 酷派手机锁屏壁纸提取
- Redis主从复制原理
- C语言实现lagrange theorem拉格朗日定理的算法(附完整源码)
- matlab画柱状图函数,series函数做柱状图
- 关于域名备案后的注意事项,血淋淋的教训
- git lfs官网翻译
- Win7 开机优化系列-上篇
热门文章
- mysql 修改max_connections
- SQL compute by 的使用
- win8.1配置java环境个人 win8.1
- 解决计算机名修改或作业移植导致的服务器名问题.sql
- VC的包含文件和引用文件是不一样的~
- php 的包管理,php composer包管理器
- OVS datapath简介(十八)
- leetcode算法题--划分为k个相等的子集★
- 学生选课管理系统c语言程序报告,c语言课程设计学生选课管理系统实验报告.doc...
- mac下java配置填坑