装饰模式

九、装饰者模式

 ̄綄美尐妖づ 提交于 2019-12-05 08:41:20
九、装饰者模式 装饰者模式 前言 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。 什么式装饰者模式 装饰者(Decorator)模式 的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰者(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 装饰者模式的结构与实现 通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。下面来分析其基本结构和实现方法。 1. 模式的结构 装饰模式主要包含以下角色。 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:实现抽象构件

九、装饰者模式

瘦欲@ 提交于 2019-12-05 08:39:50
装饰者模式 前言 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。 什么式装饰者模式 装饰者(Decorator)模式 的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰者(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 装饰者模式的结构与实现 通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。下面来分析其基本结构和实现方法。 1. 模式的结构 装饰模式主要包含以下角色。 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:实现抽象构件

MyBatis缓存详解

女生的网名这么多〃 提交于 2019-12-05 07:01:17
缓存体系结构 缓存一般是ORM框架都会提供的功能,目的就是提升查询效率和减少数据库的压力。跟Hibernate一样,MyBatis也有一级缓存和二级缓存,并且预留了集成第三方缓存的接口。 MyBatis跟缓存相关的类都在cache包里面,其中有一个Cache接口,只有一个默认的实现类PerpetualCache,它使用HashMap实现的。 除此之外,还有很多的装饰器,通过这些装饰器可以额外实现很多的功能:回收策略、日志记录、定时刷新等。 如果对装饰器不懂的,可以去看一下设计模式中的装饰者模式的资料。 但无论怎么装饰,最后使用的还是最基本的实现类PerpetualCache。 所有的缓存实现类总体上可以分为三类:基本缓存、淘汰算法缓存、装饰器缓存。 缓存实现类 描述 作用 装饰条件 基本缓存 缓存基本实现类 默认是PerpetualCache,也可以自定义比如RedisCache、EhCache等,具备基本功能的缓存类 无 LruCache LRU策略的缓存 当缓存达到上限时,删除最近最少使用的缓存(Least Recently Use) eviction="LRU"(默认) FifoCache FIFO策略的缓存 当缓存到达上限时,删除最先入队的缓存 eviction="FIFO" SoftCache WeakCache 带清理策略的缓存 通过JVM的软引用和弱引用来实现缓存

设计模式-装饰模式

淺唱寂寞╮ 提交于 2019-12-05 02:46:29
装饰模式 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。 通常是继承关系的替代方案。 常用于动态的增加对象的功能。 通用类图 组件含义 Component : 抽象的,需要被修饰的核心类。 ConcreteComponent : 被修饰的类的具体实现。 Decorator : 抽象的,包含指向Component构件的私有变量。 ConcreteComponent : 装饰类的具体实现。 demo abstract class Component { public abstract void operate(); } class ConcreateComponent extends Component { @Override public void operate() { System.out.println("do something"); } } abstract class Decorator extends Component { private Component component = null; public Decorator(Component component) { this.component = component; } @Override public void operate() { this.component

装饰器模式

天涯浪子 提交于 2019-12-05 01:50:48
按照单一职责原则,某一个对象只专注于干一件事,而如果要扩展其职能的话,不如想办法分离出一个类来“包装”这个对象,而这个扩展出的类则专注于实现扩展功能。 装饰器模式就可以将新功能动态地附加于现有对象而不改变现有对象的功能。 1.装饰器模式 实际上Java提供的工具包中,IO相关工具就普遍大量使用了装饰器模式,例如充当装饰功能的IO类如BufferedInputStream等,又被称为高级流,通常将基本流作为高级流构造器的参数传入,将其作为高级流的一个关联对象,从而对其功能进行扩展和装饰。 装饰器模式(Decorator Pattern),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更灵活。 ----《大话设计模式》 装饰器模式使用分层对象,动态透明地对单个对象添加职责。 下面是装饰器模式的UML类图: 装饰器实现修饰对象(Component)的接口,所有请求都转发给它处理,在转发请求之前/之后增加额外功能。使用步骤是: 用一个Decorator实现/继承需要修饰的对象Component; 在Decorator中增加一个Component的引用; 在Decorator的构造器中,增加一个Component参数来初始化Component; 在Decorator类中,使用Component的引用,将所有请求转发至Component的相应方法;

设计模式--装饰器模式

╄→尐↘猪︶ㄣ 提交于 2019-12-04 20:21:37
装饰器模式--装饰模式 1、装饰模式 装饰模式: 动态的给对象添加一些额外的职责,例如,给相片加各种不同的相框(相框就是装饰器)。 2、装饰模式的结构 角色 抽象组件(Component): 抽象组件定义了需要进行装饰的方法,也就是“被装饰者”角色; 具体组件(ConcreteComponent): 具体组件是抽象主件的一个子类; 装饰(Decorator): 装饰是抽象组件的一个子类,是"装饰者"角色,其作用是装饰具体组件,因此”装饰“角色需要包含”被装饰者“的引用,它可以是抽象类,也可以是非抽象类; 具体装饰(ConcreteDecorator): 具体装饰是”装饰“角色的一个非抽象子类。 类图     3、装饰模式举例 问题:给麻雀安装智能电子翅膀 抽象组件: Bird.java 1 package com.nick.pattern.decorator; 2 /** 3 * 抽象组件(被装饰者) 4 * 定义一个接口,接口中包括需要被装饰的一个抽象方法 5 * @author nick 6 */ 7 public interface Bird { 8 public abstract int fly(); 9 } 具体组件:Sparrow.java 1 package com.nick.pattern.decorator; 2 /** 3 * 具体组件(实现抽象组件) 4 *

Python笔记4

主宰稳场 提交于 2019-12-04 17:37:30
JSON: JavaScript Object Notation, JavaScript 对象标记 JSON 本质:是一种轻量级的数据交换格式 1. 轻量级 是 和 XML作比较 2. 数据交换格式 :JSON 是一种数据交换格式, 它的载体是字符串(字符串是JSON的表现形式。) Ps. JSON 对象 和 JSON 字符串的区别 符合JSON格式的字符串叫做JSON字符串, i.e { "name":"John"} Ps. JSON VS XML , JSON 在互联网领域更受欢迎。 JSON优势:易于阅读、解析,网络传输效率高,是一种跨语言交换数据(XML也是跨语言的) 反序列化 json_str='{"name":"小气","age":18}' #JSON 字符串 json_array='[{"name":"小气","age":18},{"name":"小气","age":18}]'#JSON数组 里面 是双引号的话,外面必须是单引号 JSON格式的字符串键值必须是双引号 数字可以不加双引号 json字符串loads,转换成dict字典;jsonarray数组loads,转换成列表 JSON字符串到某种语言的解析过程叫反序列化 MongoDB是nosql数据库的代表,比较适合存储序列化后的数据 反序列化是将 JSON数据类型转化成python数据类型 关键在于

设计模式之装饰器模式

旧城冷巷雨未停 提交于 2019-12-04 16:47:51
定义 Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比生成子类更为灵活 UML类图 角色 Component 抽象构件,就是装饰器与被装饰类共有的抽象。 ConcreteComponent 具体构件,就是被装饰类 Decorator 装饰器抽象,就是装饰器的抽象 ConcreteDecorator 装饰器的具体实现 应用 应用中通常代码如: 装饰类实现: //构造方法,初始化成员变量为装饰类 public ConcreteDecorator1(Component component){ //抽象装饰器中定义的构造方法,初始化被装饰类到成员变量 super(component); } public void operate(){ //这里可以添加一些功能增强 this.component.operate() //这里可以添加一些功能增强 } 场景类应用: Component component = new

contextlib:上下文管理器工具

风流意气都作罢 提交于 2019-12-04 16:26:56
介绍 contextlib模块包含的工具可以用于处理上下文管理器和with语句 上下文管理器API ''' 上下文管理器(context manager)负责管理一个代码块中的资源,会在进入代码块时创建资源,然后再退出代码后清理这个资源。 比如:文件就支持上下文管理器API,可以确保文件读写后关闭文件。 with open("xxx") as f: f.read() ''' # 那么这是如何实现的呢?我们可以手动模拟一下 class Open: def __init__(self, filename, mode='r', encoding=None): self.filename = filename self.mode = mode self.encoding = encoding def __enter__(self): print("__enter__,有了这个就可以使用with Open() as xx语句,这里的xx就是我return的内容") return self def read(self): print(f"文件进行读操作,读取文件:{self.filename}, 模式:{self.mode}, 编码:{self.encoding}") def __exit__(self, exc_type, exc_val, exc_tb): print("__exit__

《HeadFirts设计模式》笔记

会有一股神秘感。 提交于 2019-12-04 12:20:17
定义 在某种情境下,针对某些问题的某种解决方案。 设计模式 1.可拓展性强,方便维护,能够应付变化。 何时使用设计模式 设计之前,还有在重构的时候。 OOP 可复用,可扩充,可维护 设计模式原则 1.封装变化。 找出可能需要变化的部分,独立出来。 2.面向接口编程。 这里的“接口”实际指的是“超类型”,比如接口,或者抽象类。 用接口声明,用具体的实现类实例化。 针对接口,通过多态,新类可以实现接口。通过接口编程,可以隔离掉以后系统可能发生的一堆变化。 3.多用组合,少用继承。 组合是has-a,而继承是is-a。 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。因此,使用组合的做法拓展对象的行为,可以在运行时动态地拓展。 4.交互对象之间要松耦合。 5.类应该对拓展开放,对修改关闭。 继承 优点:代码复用。子类可以调用父类的方法及属性。 缺点: 1.利用继承设计子类的行为,是在编译时静态决定的。难以支持多种变化的行为(方法)。 2.子类不得不拥有父类的所有方法属性。所有子类都会继承到相同的行为。 3.如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想。 图形:一般用三角形加上实线表示。 接口 优点:支持变化,有多种实现类。 缺点:代码无法复用。 图形