无用的设计模式之装饰者模式

为什么80%的码农都做不了架构师?>>>   hot3.png

前言

      装饰者设计模式本来是很常用的模式,常用到随处可见,jdk的bio设计都是遵循这个模式的,偶然的机会发现,貌似jdk中bio的装饰者模式和设计模式中的装饰者设计模式却有点本质上的不同,但是仔细想想,貌似bio的设计貌似还有点违背设计模式的本意,此文中把装饰者模式说成无用,是因为他定义的这种规范的玩法,大家貌似并不遵从,反而更喜欢jdk中的用法。


类图

130603_LChj_1463652.png

        这个类图大家也并不陌生,具体的被装饰的类和装饰者都是遵循同一个规范,component,此处如果component没有公共的定义方法,那就是妥妥的面向接口编程。看这个用法我们也能猜到怎么用,先创建被装饰的类,然后用装饰类去修饰被装饰的类,然后把引用给component,调用operation的时候就把装饰的效果显示出来,如果需求变更,那么直接把装饰组合出来的过程改改,其他代码不需要改变。


jdk bio的用法

         作为装饰者模式的典型,他的类图完全和上面的类图吻合,但是我们的用法却大大不同,我们包装后的IO类,我们很少直接让接口来作为引用,每一个装饰类都带了自己的新特性,API都不一样了。我们想要用包装类的功能就必须使用包装类的引用,否则就切面了,我们能用到的只有接口的方法。他的侧重是不同的包装是不同的功能,类似readline,只有bufferedreader有,我们想用只能依靠这个包装类,但是类本身也遵循接口,所以也能传递给接口,但是要损失包装的特性。


两种用法的对比

        单纯从软件设计讲,jdk io的设计扩展性不好,因为你选择包装,本来就是希望调用统一的方法,这样对代码的修改最小。但现实是我们如果不用具体的类无法增加新的功能。也就是说你想体现新的功能的话,后面的代码基本要重写。大家公有的那部分方法压根没有增强到,这样写肯定会带来不小的隐患,但很特殊的是,他设计的是IO,一般读取完就over,有传递的可能性,但是用接口传过去后重新包装一下又可以使用了,反正是各自包装各自的,公有的方法都不用,这样下来反而也没什么影响。要选择这么使用的话一定得慎重,用不好就带来很多麻烦。


适合场景

        一看类图,大家基本就能感觉这个更像补救型的模式,就是原来的类都实现好了,现在突然要改需求,给里面的部分类的方法都增加一种或者多种功能,这样装饰者模式就派上用场了,直接在建造对象的地方加一段装饰,当然这个前提都是被装饰的类和装饰的类都是可以估计的,遇到不可估计的情况还是直接用aop动态代理吧,不要再考虑装饰模式。既然是补救行的,那么也是有一定要求的。

142502_d2Ql_1463652.png

        起码最初的类图是这样的,要不然还要添加接口等等(这个肯定是不可取的),POJO的话还是用动态代理的好。

        另外一种适合情况就是多继承,要对中间继承类需要增加,这种情况用装饰者模式不会影响子类的功能。


和静态代理的区别

       其实文中多次提到代理,其实在功能单一的情况下,代理和装饰都可以,我最后想想还是从功能上做点区别,装饰者适合新增的功能可以互相组合的情况,及装饰类和装饰类是可以叠加操作的,并且被装饰的方法还是较少的,装饰的类的个数也是较少的。静态代理更适合类中方法很多,但是只会代理一层,出现多层代理基本就是不合理的,典型的就是datasource中用自己的connection类代理jdbc中的connection类。


最后说几句

       其实用装饰者模式带来种种功能上的好处,但是一旦出现问题,你自己写的代码还好,要是让纯粹不知道的人走断点找问题,那跟断点可就费事了,所以一定留好设计文档和把类的名字起的见字生义。










转载于:https://my.oschina.net/xpbob/blog/662292

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转-HTC 手机生产日期,产地查询 以及 SN码 IMEI码 查询等问题汇总

问:什么是IMEI码?什么是SN码? 答:IMEI码,国际移动装备辨识码(International Mobile Equipment Identity number,IMEI)。SN码即Serial Number,产品序列号。 问&#xff1a…

C#生成带Logo二维码

1.下载ThoughtWorks.QRCode引用并添加在工程中 2.在实现类QRCodeEncoderDemo中引入Dll,添加方法 using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Web;using ThoughtWorks.QRC…

51单片机实现三位十进制数加减乘除运算

51单片机实现三位十进制数加减乘除运算 一.题目 51单片机IO接口作业 请将附件给出的Proteus图用51单片机完成一个计算器功能。 1、显示采用动态分时8位共阳数码管输出。 2、采用4*4矩阵键盘输入,键盘上已经标识对应键。 3、完成三位十进制数的加、减、乘、除运…

未能加载文件或程序集“Microsoft.Office.Interop.Owc11, Version=11.0.0.0, ...”或它的某一个依赖项~[解决方案]...

配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。 分析器错误信息: 未能加载文件或程序集“Microsoft.Office.Interop.Owc11, Version11.0.0.0, Cultureneutral, PublicKeyToken71e9bce111e9429c”或它的某一个…

方法javaJVM学习笔记-内存处理

本文是一篇关于方法java的帖子 大多数JVM将内存区域分离为Method Area(Non-Heap),Heap,Program Counter Register,Java Method Statck,Native Method Stack和Direct Memomry(备注:Di…

数据结构单向不循环链表实现多项式合并

多项式合并 思路 多项式合并 P1 5 2x 8x ^8 3x^16 P2 6x 16x^6 - 8x^8 P P1 P2 5 8x 16x^6 3x^16 使用带头结点的单向不循环链表 每个节点分为三个部分,系数项,指数项,指针域 结构体表示为 struct node_st {int exponent;int …

下 终端_Linux/UNIX 下终端复用利器 tmux

tmux 是一个终端复用器(terminal multiplexer)。简介tmux 是一个终端复用器类自由软件,功能类似 GNU Screen,但使用 BSD 许可发布。用户可以通过 tmux 在一个终端内管理多个分离的会话,窗口及面板,对于同时使用多个命令行&#xf…

消失的字符串——c语言函数中的数据存储方式以及字符串实现

2019独角兽企业重金招聘Python工程师标准>>> 事情是这样的,最近在学习翁老师的Mooc之C语言程序设计,插一句,真的是好老师,讲的真的太好了,在c里的字符串这里,翁老师演示了一个小程序&#xff0c…

JQuery 文本框高亮显示插件

以前使用Mootools Js框架,文本框有个$(id).highlight()高亮方法,使其高亮显示,效果如下: JQuery 中没有这个方法,自己今天写了一个Plugin,把代码贴出来分享一下; 代码如下: jquery-h…

链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链

最近研究链方法,稍微总结一下,以后继续补充: 弁言: 上一专题分析了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的分析都是委托只是封装一…

51单片机lcd1602的简单实用

基础知识准备 lcd1602简介 图片来自b站斌哥单片机 需要关注的有以下几点: RS : 高数据低命令;RS 1时,lcd1602读写数据,RS0时,lcd1602读写命令R/W:高读低写;RW1时,单片机读取lcd160…

firedebug调试Jquery

不了解的同学先“点这里”看看什么是Firebug。简单来说,Firebug是Firefox上用来监视、编辑和调试站点的CSS、HTML、DOM和JavaScript的扩展工具。 我们先到Firebug的主页上下载最新的版本装上,下面开始调试: 1、查看、编辑HTML元素及其(转) 安…

51单片机数字钟的实现

作业 用51单片机完成一个数字钟的计时及校时功能。 1、设置8个数码管的显示缓冲区为DISPBUFF[8],并初始化为02,02,-,04,08,-,03,06. 2、定时器0每隔5ms刷新一次数码管显示缓冲区,并显示时间(中断来做) 3、定时器1负责精确定时,计时1s,每隔…

Google Map API 学习三

转载于:https://www.cnblogs.com/MyFlora/p/3154066.html

慎用SELECT INTO复制表

很多时候我们习惯于用SELECTINTO 复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意: SELECT INTO 复制表或表结构的时候,只是得到了一个“外壳”,就像克隆…

信号的采样与插值重建(包含matlab)

实验任务 双频信号的采样和插值重建:对双频信号进行采样(符合奈奎斯特低通采样定理),绘制波形和频谱;编制sinc函数插值函数,对采样进行恢复,绘制波形。 实验原理 matlab代码 clear all; clos…

dc概论之IO约束

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://bb2hh.blogbus.com/logs/39654476.html 注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong以下根据资料和个人体…

普通调幅(AM)与抑制载波双边带调幅(DSB)matlab编程实现

实验任务 实现单频信号的AM、DSB调制,绘制调制前后的波形和频谱 实验原理 matlab代码 AM调制 clear all; ts 0.0025; %信号抽样时间间隔 fs 1/ts; %抽样频率 t 0:ts:10-ts; %时间向量 df fs/length(t); %fft的频率分辨率 msg2 cos(2*pi*2*t); Pn fft(msg2…

MySQL中MySQL X.X Command Line Client一闪而过的问题

问题介绍:我安装完MySQL(我安装的是5.5)后,使用MySQL 5.5 Command Line Client,每次点击,总是一闪而过。解决方法如下:首先进入cmd 切入MySQL的安装目录,然后切入 bin 目录 ,输入mysqld-nt --sk…

4pam调制与解调(matlab实现)

实验原理 这是一种使用脉冲幅度调制技术的线路编码。PAM4信号有四个电压电平,每个幅度电平分别对应逻辑比特00、01、10和11。换言之,PAM4编码的每个符号由2个比特组成,它们对应一个电压电平,即幅度。 00对应-3,01对应-1,10对应1,…