装饰模式

策略模式Strategy、装饰模式Decorator

老子叫甜甜 提交于 2019-12-02 10:10:46
策略模式Strategy 定义: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、可维护、可扩展。 策略算法对算法调度具有平等性,算法仅仅是一种性质相同而行为不同的处理,地位相同,可相互替换,算法之间没有依赖关系。 —抽象策略角色: 策略类,通常由一个接口或者抽象类实现。 —具体策略角色:包装了相关的算法和行为。 —环境角色:持有一个策略类的引用,最终给客户端调用。 策略模式UML图示 应用场景: 1、 多个类只区别在表现行为不同(性质一样,但行为不同) ,可以使用Strategy模式,在运行时动态选择具体要执行的行为。 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现(动态)。 3、 对客户隐藏具体策略(算法)的实现细节(只公开一个功能,隐藏此功能实现的细节),彼此完全独立。 优点: 1、 提供了一种替代继承的方法 ,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。 2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。 3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。 缺点: 1、 因为 每个具体策略类都会产生一个新类 ,所以会增加系统需要维护的类的数量。

设计模式-装饰器模式

孤人 提交于 2019-12-02 06:02:07
装饰器(Decorator)模式指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。采用装饰模式扩展对象的功能比采用继承方式更加灵活;可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。但是装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 模式结构 装饰器模式的角色如下: 顶层接口 被装饰者 装饰器抽象类 装饰器 源码导读 装饰器模式使用的典型就是io流了,前面适配器模式我们说到过io流使用了适配器模式,用于字节流转换到字符流;装饰器模式在io流中也是一个很经典的使用。其使用的地方就是给流装饰上缓存。以输入流为例, BufferedInputStream 就是对 FileInputStream 的装饰,我们看一下这段代码: String file = "out.txt"; InputStream ins = new FileInputStream(file); BufferedInputStream bufin= new BufferedInputStream(ins); int b; while((b=bufin.read())!=-1){ System.out.println(Integer.toHexString(b)); } BufferedInputStream 源码: public class

设计模式-装饰器模式

我只是一个虾纸丫 提交于 2019-12-02 05:59:42
装饰器(Decorator)模式指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。采用装饰模式扩展对象的功能比采用继承方式更加灵活;可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。但是装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 模式结构 装饰器模式的角色如下: 顶层接口 被装饰者 装饰器抽象类 装饰器 源码导读 装饰器模式使用的典型就是io流了,前面适配器模式我们说到过io流使用了适配器模式,用于字节流转换到字符流;装饰器模式在io流中也是一个很经典的使用。其使用的地方就是给流装饰上缓存。以输入流为例, BufferedInputStream 就是对 FileInputStream 的装饰,我们看一下这段代码: String file = "out.txt"; InputStream ins = new FileInputStream(file); BufferedInputStream bufin= new BufferedInputStream(ins); int b; while((b=bufin.read())!=-1){ System.out.println(Integer.toHexString(b)); } BufferedInputStream 源码: public class

Java笔试面试-设计模式

。_饼干妹妹 提交于 2019-12-02 05:22:28
1.说一下设计模式?你都知道哪些? 答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。   ①创建型模式( Creational Patterns ): 工厂模式(Factory pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Patern) 创建者模式(Builder Pattern) 原型模式(Prototype Pattern)   ②结构型模式( Structural Patterns ): 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter Pattern) 组合模式(Composition Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 代理模式(Proxy Pattern) 享元模式(Flyweight Pattern)   ③行为型模式( Behavioral Patterns ): 访问者模式(Visitor Pattern) 模板模式(Template Pattern) 空对象模式(Null

装饰者模式

半世苍凉 提交于 2019-12-02 04:58:29
一:装饰者模式定义(mybatis的Executor。I/O流): 动态的给一个对象添加一些额外的职责,就增加功能而言,装饰模式相比生成子类更为灵活 二:装饰者模式特点: 一般由5部分组成。第一个是抽象的component组件类,第二个是具体的concreteComponete,也就是需要被装饰的类,第三个是抽象的装饰者类,该类也需要继承抽象的component组件类,同时将抽象组件类通过构造函数注入。第四个是具体的装饰类,这里定义需要装饰的方法。第五个是测试类。 三:装饰者模式实现: 抽象组件类: public abstract class Component { public abstract void operate(); } 具体组件类: public class ConcreteComponent extends Component { @Override public void operate() { System.out.println("核心处理的业务逻辑"); } } 抽象装饰者类: public abstract class Decorator extends Component { private Component component = null; public Decorator(Component component) { super(); this

python字符串内置函数

孤街浪徒 提交于 2019-12-02 02:59:49
1、字符串 定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,‘’或“”或‘’‘ ’‘’中间包含的内容称之为字符串特性:1.只能存放一个值2.不可变3.按照从左到右的顺序定义字符集合,下标从0开始顺序访问,有序补充:  1.字符串的单引号和双引号都无法取消特殊字符的含义,如果想让引号内所有字符均取消特殊意义,在引号前面加r,如name=r'l\thf'  2.unicode字符串与r连用必需在r前面,如name=ur'l\thf' 2、字符串常用操作 # 1字母处理: .upper() # 全部大写 .lower() # 全部小写 .swapcase() # 大小写互换 .capitalize() # 首字母大写,其余小写 .title() # 首字母大写 a='helLO' print(a.upper()) # 全部大写 print(a.lower()) # 全部小写 print(a.swapcase()) # 大小写互换 print(a.capitalize()) # 首字母大写,其余小写 print(a.title()) # 首字母大写 View Code # 2格式化相关 .ljust(width) # 获取固定长度,左对齐,右边不够用空格补齐 .rjust(width) # 获取固定长度,右对齐,左边不够用空格补齐 .center(width) #

装饰器模式

99封情书 提交于 2019-12-01 22:23:59
装饰器模式 装饰器模式又称为包装(Wrapper)模式。 装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案 。 http://www.wityx.com/post/240_1_1.html 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类的方式并不可取,在面向对象的设计中,我们应该尽量使用组合对象而不是继承对象来扩展和复用功能,装饰器模式就是基于对象组合的方式的。 装饰器模式以对客户端透明的方式动态地给一个对象附加上了更多的责任。换言之,客户端并不会角色对象在装饰前和装饰后有什么不同 。装饰器模式可以在不用创建更多子类的情况下,将对象的功能加以扩展。 装饰器模式中的角色有: 1、抽象构件角色 给出一个抽象接口,以规范准备接受附加责任的对象 2、具体构件角色 定义一个将要接受附加责任的类 3、装饰角色 持有一个构建对象的实例,并定义一个与抽象构件接口一致的接口 4、具体装饰角色 负责给构建对象贴上附加的责任 装饰器模式的例子 现在有这么一个场景: 1、有一批厨师,简单点吧,就全是中国厨师,他们有一个共同的动作是做晚饭 2、这批厨师做晚饭前的习惯不同,有些人喜欢做晚饭前洗手、有些人喜欢做晚饭前洗头 那么,按照装饰器模式,先抽象出抽象构建角色,Cook接口: public

python中的装饰器

北战南征 提交于 2019-12-01 16:51:36
什么是装饰器:可以理解为添加新的功能。定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。装饰器形成的过程 *args 接收:聚合 调用:打散import timeprint(time.time())time.sleep(3)#让程序执行到此位置的时候停留print('vhdihfiufhui')def timer(f):#计算函数的执行时间 start = time.time() f() end=time.time() print(end-start)def func(): time.sleep(1) print('hahahhah')timer(func)装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质是:闭包原则:开放封闭原则 1.对扩展是开放的 2.对修改是封闭的     装饰器的固定模式def func(): time.sleep(2) print('哈哈哈哈哈')def timmer(func): #闭包 ----》指向func的内存地址 timmer就是一个装饰器函数 def inner(): start=time.time() func() #被装饰的函数 end=time.time() print(end-start) return innerfunc=timmer(func)

设计模式之装饰模式

强颜欢笑 提交于 2019-12-01 16:15:29
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 优点: 1、把类中的装饰功能从类中搬移去除,这样可以简化原有的类。 2、有效的把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。 来源: https://www.cnblogs.com/hssds/p/11692416.html

Golang 实现设计模式 —— 装饰模式

流过昼夜 提交于 2019-12-01 10:08:54
概念 “用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能” “动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活” 何时用 需要扩展一个类的功能,或给一个类增加附加责任 需要动态的给一个对象增加功能,且可以动态地撤销它 需要增加一些基本功能的排列组合而产生的大量的功能,而使得继承变得非常困难的时候 实现构件 抽象构件(Component) 表示“被”装饰的本体的抽象定义,这个定义通常是一个接口(Interface),定义了若干方法(能力),这些方法可以用来在被具体装饰角色(ConcreteDecorator)实现时改变原有构件本体的方法(能力),如原来本体伤害输出是 10,装饰角色把它再增加 10 而不会影响本体的原有逻辑(代码)。 具体构件(ConcreteComponent) 表示实现了抽象构件(Component)的对象,即将要接受附加能力的对象,本文中比喻的“本体”。 抽象装饰(Decorator) 持有一个抽象构件的实例(即具体构件),并定义(实现)与抽象构件接口一致的接口。抽象装饰的(部分)作用应该是应用了依赖倒置原则,在结构上使具体装饰(ConcreteDecorator)不要直接依赖于抽象构件,因为二者作用性质也不同,直接依赖灰常奇怪,就好像都是50岁的男子也不能把隔壁老王当成爸爸一样。 具体装饰