一. 举例 我之前做过一个文件系统就叫 MyFileSys 吧,后来的话,客户想加入一些附加功能,比如压缩.加密.杀毒之类的操作,这些附加操作没有先后顺序,比如你可以先压缩再加密,也可以先杀毒再压缩,等等. 这些附加功能是可选的,有的客户要这些功能,有的不要,有的要其中的几种附加功能等等.怎么设计呢? 第一种方案: 直接修改这个独立的文件系统 MyFileSys,对于不同的客户实现不同的文件系统. 后来随着客户的增多,发现维护和修改的工作量越来越大.因为每增加一个客户就要重新生成一个类,然后把客…
设计原则 类应该对修改关闭,对扩展开放(开放-关闭原则).在每个地方使用开放-关闭原则是一种浪费,也没有必要,因为这通常会引入新的抽象层次,增加代码复杂度.需要把注意力集中在设计中最有可能改变的地方. 装饰者模式 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案.…
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许…
php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去),在这个类的外部,在装饰器中. 4 class Art { 5 protected $content; 6 public function __construct($content) { 7 $this->content = $content; 8 } 9 10 public function d…
1 星巴克咖啡订单项目(咖啡馆): 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡).ShortBlack.LongBlack(美式咖啡).Decaf(无因咖啡) 2) 调料:Milk.Soy(豆浆).Chocolate 3) 要求在扩展新的咖啡种类时,具有良好的扩展性.改动方便.维护方便 4) 使用 OO 的来计算不同种类咖啡的费用:  客户可以点单品咖啡,也可以单品咖啡+调料组合. 2 方案 1-解决星巴克咖啡订单项目 3 方案 1-解决星巴克咖啡订单问题分析 1) Drink 是…
前言 ​ 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式.本章节参考资料书籍<Spring 5核心原理>中的第一篇 Spring 内功心法(Spring中常用的设计模式)(没有电子档,都是我取其精华并结合自己的理解,一个字一个字手敲出来的,如果觉得本文对你有用,请点个推荐). 适配器模式 适配器模式的应用场景 ​ 适配器模式(Adapter Patter…
1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体的装饰对象,…
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这个APP现在不行了,这都是这三个月来第4个APP了...”“这个啊,那不是简单的很么?”“简单,别闹了,你以为APP是大白菜啊,说有就有啊.”“这个时候就是我桥接模式出场的时候了~” 桥接模式之自我介绍 大家好,我的英文名字叫“Qiaojie Moshi”,我的中文名字叫桥接模式.(欸?哪里优点不对…
职责 装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀. 1,不改变原类文件. 2,不使用继承. 3,动态扩展. 实现细节 Component抽象构件角色: 真实对象和装饰对象有相同的接口.这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互. ConcreteCom…
1      模式简介 装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构. 装饰者模式的思路是用"调料"对象将原始对象进行层层包裹,同时其属性.动作层层传递,达到最终的扩展效果.因此,要求原始对象和"调料"对象继承同一个类或实现同一个接口,这样才能在装饰完成后调用原始对象的属性或动作. 装饰者模式的优点: 1)        可以动态的扩展功能: 2)        装饰者和被装饰者解耦,互相不关联. 装饰者模式的缺点: 多层装饰比较复杂. 装饰者模式…
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).AccessoriesPhone(挂件手机类)等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责.下面让我们看看装饰者模式. 二.装饰者模式的详细介绍 2.1 定义 装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生…
<?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; charset=utf-8"); /************************ <装饰器模式 实现> ************************/ //文章基础类 class BaseWz{ protected $content; //定义文章内容属性 protected…
装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能. 一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能. 我们还是来玩一句红警,首先我们进入游戏,这时我们只有一个基地车,右边的界面有个黑色的框,什么操作也没有. 这里,我们假定有个操作的接口Operation public interface Operation { //操作 public void doOperation(); } 我们自己,叫做一个MyOperation,实…
装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它. 装饰者可以在所委托被装饰者的行为前与/或之后,加上自己的行为,已达到特定的目的. 对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者来装饰对象 设计原则:类应该对扩展开放,对修改关闭(开放-关闭原则)…
发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去. 首先设计一个房子类Room,实现一个进入方法Access /// <summary> /// 抽象接口 用来进行约束 /// </summary> public interface IAccess { void Access()…
序 好久没写设计模式了,自从写了两篇之后,就放弃治疗了,主要还是工作太忙了啊(借口,都是借口),过完年以后一直填坑,填了好几个月,总算是稳定下来了,可以打打酱油了. 为什么又重新开始写设计模式呢?学习使我快乐啊(我装逼起来我自己都害怕),其实主要是最近填坑的时候看源代码有点晕,很多代码不知道他们为什么要那么写啊,好气啊 当时第二篇写完,其实就在准备第三篇了,但是,一直也没有写,看了好几遍,但是一直掌握不到精髓(其实现在也掌握不到),感觉挺模糊的,也就一直拖啊拖,拖延症晚期患者已经不用抢救了...…
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元,现在a买一个煎饼,b买加蛋的煎饼,c买加肠加蛋的煎饼,请实现它 煎饼类: package com.geely.design.pattern.structural.decorator.v1; /** * 创建煎饼类 */ public class BatterCake { /** * 获取加的种类…
重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior或算法设计成接口.具体不同的Behavior实现该接口.原来的类中含有算法接口的成员.通过set或constructor设定Behavior或算法. 结合Head First例子记忆.将Duck的Fly,Swim,Quack,Display等都抽象成接口.然后不同的算法实现各自的接口.在Duck中包…
一.UML图   介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类. 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的…
Decorator模式就是不断地为对象添加装饰的设计模式.以蛋糕为例,程序中的对象就相当于蛋糕,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象. 首先看示例程序的类图. 然后看示例程序代码. package bigjunoba.bjtu.decorator; public abstract class Display { public abstract int getColumns(); public abstract int getRows(); public…
从一个业务开始 最近项目上紧急需要,为了应付一个不知道啥的安全检测,我们要给系统追加防XSS注入的功能,这里有经验的JavaWeb开发就会想到,用过滤器或者基于项目框架的拦截器来做,但是顺着这个思路下去,我们会发现一个很尴尬的问题,如果我们在过滤器里把Request对象的参数拿处理校验(即表明使用了Reuqest的参数),那么后续的过滤器或者Controller都将得到一个"失效"的Request对象,后面的逻辑全线垮掉-- 于是,爱好学习的你就去了某度,某度经过检索,给了你一个页面-…
装饰器模式(Decorator) 概述 1.装饰器模式可以动态地添加修改类的功能 2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法 3.使用装饰者模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性 代码实现如下 使用原型模式中的Canvas类,如果当前想设置draw()方法画图的颜色为红色,传统的方式实现如下: 定义一个子类,重写draw()方法,从而实现特定的功能:如果需要增加很多功能呢?就会遇到问题: 使用装饰者…
(七)装饰 Decorator 装饰是一个对象,以动态地增加一些新功能. 象与被装饰的对象须要实现同一个接口.装饰对象持有被装饰对象的实例. interface DecoratorSourceable{ public void method(); } //被装饰类 class DecoratorSource implements DecoratorSourceable{ public void method(){ System.out.println("Source"); } } //…
装饰者模式 背景是有一家星巴兹咖啡店,由于客源充足,所以决定重新设计他们的收费系统,以前的收费系统中只定义了一个表示饮料的Beverage的基类,它里面定义了一个Cost的方法用来计算饮料的花费,但是对于星巴兹来说他们的饮料的种类实在太多了,不能就每一种饮料就建立一个子类,类型爆炸! 所以要进行一番设计,来改变目前这种类型爆炸的局面. 利用继承设计子类的行为,实在编译时静态决定的,而且所有的子类都会继承到相同的行为,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态的进行扩展.通过动态的组…
1.装饰者模式介绍 装饰者顾名思义就是对一个类添加一些额外的装饰(功能).我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法.考虑一种情况,如我们要给父类中的Show方法添加三个新功能功能a.功能b.功能c,这三种功能组合在一起时数目和执行顺序不同,效果也是不同的,为了现实所有的功能,我们需要创建很多子类,如子类1的show方法:BaseShow+功能a,子类2的show方法:BaseShow+ab,子类3的show方法:…
一,概念 装饰者模式(Decorator):动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案. 多组合,少继承 二,UML图 抽象构件类(Component):给出一个抽象的接口,用以规范准备接收附加责任的对象 具体构件类(ConcreteComponent):定义一个具体的准备接受附加责任的类,其必须实现Component接口. 装饰者类(Decorator):持有一个构件(Conponent)对象的实例,并定义一个和抽象构件一致的接口. 具体装…
目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如hello world. 我们通过装饰器对这句话进行装饰--加上左右边框形成|hello world|,再加上上下边框线包围这句话,形成 +-------------+ |Hello, world.| +-------------+ UML图 每个类的解释 Display类:代表一段话的显示.使用了模版…
0.前言 下午做事效率很低,无精打采的,整个脑子就跟浆糊一样,看看时间一点点流去,心中只能无可奈何,哎,码农的激情难道就这么容易熄灭吗? 1.该模式的使用情况 假如我们想给对象增加功能,但是又不想修改原有对象,也不想或不便通过继承来实现,那么装饰者模式来帮你解决难题. 2.与组合模式的异同 相同:都要与所包装的对象实现统一的接口,并且会把任何方法调用传递给这些对象. 不同:组合模式是把众多子对象组织成为一个整体,形成层次的树形结构:而装饰者模式用于在不修改现有对象或从派生子类的前提下为其添加方法…
在Java在.io反映非常多类包下是典型的装饰格局,例如: new BufferedOutputStream(OutputStream out) new BufferedInputStream(InputStream in); new PrintWriter(OutputStream out) new FilterReader(Reader in); 装饰类与被装饰的类 实现同样的接口, 被装饰类.不关心详细是哪个实现类来装饰它, 相同的业务方法,被装饰类调用装饰类的方法,增强装饰类的功能 演示…
第3章 装饰者模式 1.定义/说明 动态.透明的将职责附加到对象上(或从对象上撤销),而不影响其他对象.若要扩展功能,装饰者模式提供了比继承更富有弹性的替代方案. 2.介绍 首先让我们先来介绍一下场景,EDI_KAI咖啡店开业了,需要有一套咖啡订单系统,以合乎他们的饮料供应需求. 注意:购买咖啡时,根据客户需要可以在其中加入各种调料,例如,蒸奶(Steamed Milk),豆浆(Soy),摩卡(Mocha也就是巧克力风味)或者覆盖奶泡 下面是我们的初步设计方案: 为了设计的健壮性,所以订单系统必…