装饰模式

修饰者模式(装饰者模式,Decoration)

丶灬走出姿态 提交于 2019-12-01 09:55:16
转自: https://www.cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。 ApplicationContext接口,它由BeanFactory接口派生而来,ApplicationContext包含BeanFactory的所有功能,通常建议比BeanFactory优先 BeanFactory和FactoryBean的区别 BeanFactory是接口,提供了OC容器最基本的形式,给具体的IOC容器的实现提供了规范, FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式(如果想了解装饰模式参考: 修饰者模式(装饰者模式,Decoration) 我们可以在getObject()方法中灵活配置。其实在Spring源码中有很多FactoryBean的实现类. 区别:BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,

一篇文章搞懂装饰器所有用法(建议收藏)

落爺英雄遲暮 提交于 2019-12-01 07:58:56
01. 装饰器语法糖 # 如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖。 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为 装饰函数 或 装饰器 。 你要问我装饰器可以实现什么功能?我只能说你的脑洞有多大,装饰器就有多强大。 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类、偏函数实现) 再定义你的业务函数、或者类(人) 最后把这顶帽子带在这个人头上 装饰器的简单的用法有很多,这里举两个常见的。 日志打印器 时间计时器 02. 入门用法:日志打印器 # 首先是 日志打印器 。 实现的功能: 在函数执行前,先打印一行日志告知一下主人,我要执行函数了。 在函数执行完,也不能拍拍屁股就走人了,咱可是有礼貌的代码,再打印一行日志告知下主人,我执行完啦。 Copy Copy # 这是装饰函数 def logger(func): def wrapper(*args, **kw): print('我准备开始计算:{} 函数了:'.format(func.__name__)) # 真正执行的是这行。 func(*args, **kw) print('啊哈

JAVA IO 设计模式彻底分析

此生再无相见时 提交于 2019-12-01 06:51:42
一。引子(概括地介绍Java的IO)   无论是哪种编程语言,输入跟输出都是重要的一部分,Java也不例外,而且Java将输入/输出的功能和使用范畴做了很大的扩充。它采用了流的 机制来实现输入/输出,所谓流,就是数据的有序排列,而流可以是从某个源(称为流源或Source of Stream)出来,到某个目的地(称为流汇或Sink of Stream)去的。由流的方向,可以分成输入流和输出流,一个程序从输入流读取数据向输出流写数据。   如,一个程序可以用FileInputStream类从一个磁盘文件读取数据,如下图所示:   像FileInputStream这样的处理器叫做流处理器,它就像流的管道一样,从一个流源吸入某种类型的数据,并输出某种类型的数据。上面这种示意图叫做流的管道图。   同样道理,也可以用FileOutputStream类向一个磁盘文件写数据,如下图所示:   在实际应用这种机制并不没有太大的用处,程序需要写出地通常是非常结构化的信息,因此这些byte类型的数据实际上是一些数值,文字,源代码 等。Java的I/O库提供了一个称做链接(Chaining)的机制,可以将一个流处理器跟另一个流处理器首尾相接,以其中之一的输出为输入,形成一个 流管道的链接。   例如,DataInputStream流处理器可以把FileInputStream流对象的输出当作输入

修饰者模式(装饰者模式,Decoration)

坚强是说给别人听的谎言 提交于 2019-12-01 05:00:24
BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。 ApplicationContext接口,它由BeanFactory接口派生而来,ApplicationContext包含BeanFactory的所有功能,通常建议比BeanFactory优先 BeanFactory和FactoryBean的区别 BeanFactory是接口,提供了OC容器最基本的形式,给具体的IOC容器的实现提供了规范, FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式(如果想了解装饰模式参考: 修饰者模式(装饰者模式,Decoration) 我们可以在getObject()方法中灵活配置。其实在Spring源码中有很多FactoryBean的实现类. 区别:BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中, 所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的 。但对FactoryBean而言, 这个Bean不是简单的Bean

Python何时执行装饰器

孤街浪徒 提交于 2019-12-01 04:52:23
装饰器的一个关键特性是,它们在被装饰的函数定义之后立即运行。这 通常是在导入时(即 Python 加载模块时),如示例 7-2 中的 registration.py 模块所示。   示例 7-2 registration.py 模块 registry = [] def register(func): print('running register(%s)' % func) registry.append(func) return func @register def f1(): print('running f1()') @register def f2(): print('running f2()') def f3(): print('running f3()') def main(): print('running main()') print('registry ->', registry) f1() f2() f3() if __name__ == '__main__': main() 运行结果 running register(<function f1 at 0x0000027913AA8708>) running register(<function f2 at 0x0000027913AA8E58>) running main() registry -> [

Filter - 全局编码 (装饰者模式)

左心房为你撑大大i 提交于 2019-12-01 04:30:58
1 package cn.itcast.web.filter; 2 3 import java.io.IOException; 4 import java.io.UnsupportedEncodingException; 5 import java.util.Map; 6 import javax.servlet.Filter; 7 import javax.servlet.FilterChain; 8 import javax.servlet.FilterConfig; 9 import javax.servlet.ServletException; 10 import javax.servlet.ServletRequest; 11 import javax.servlet.ServletResponse; 12 import javax.servlet.annotation.WebFilter; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletRequestWrapper; 15 16 /** 17 * 编码过滤器(用于统一项目编码,防止出现乱码) 18 */ 19 @WebFilter("/*") 20 public class

Python装饰器

空扰寡人 提交于 2019-11-30 19:56:17
# class WithoutDecorators: # def some_static_method(): # print('this is a static method') # some_static_method = staticmethod(some_static_method) # def some_class_method(cls): # print('this is a class method') # some_class_method = classmethod(some_class_method) # WithoutDecorators.some_class_method() # WithoutDecorators.some_static_method() #类的静态方法申明(装饰模式)) class WithoutDecorators: def foo(self): print('foo') @staticmethod def some_static_method(): print('this is a some_static_method') WithoutDecorators.foo(WithoutDecorators()) #静态方法在调用类的非静态方法时候需要实例化类本身 #因此静态方法申明尽量只处理单一的与类属性无关的逻辑 @classmethod

设计模式--装饰者模式

不羁岁月 提交于 2019-11-30 19:50:15
以一个计算器为例 抽象的计算器接口 public interface Calculator { double calculate(double a, double b, String op); } 计算方法抽象类,用于装饰计算器 public abstract class Operate implements Calculator { Calculator calculator; public Operate(Calculator calculator) { this.calculator = calculator; } } 普通的加减乘除计算机,实现Calculator接口 public class SimpleCalculator implements Calculator { @Override public double calculate(double a, double b, String op) { if ("+".equals(op)) { return a + b; } else if ("-".equals(op)) { return a - b; } else if ("*".equals(op)) { return a * b; } else if ("/".equals(op)) { if (b == 0) { throw new

学习设计模式——装饰者模式

你说的曾经没有我的故事 提交于 2019-11-30 18:50:57
在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。下面来分析其基本结构和实现方法。 1. 认识装饰者模式 1. 定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 2. 装饰模式的组成:装饰模式主要包含以下角色。 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。 3. 参考代码: public class DecoratorPattern { public

JAVA 设计模式 --- 装饰者模式

主宰稳场 提交于 2019-11-30 18:04:47
装饰者模式 (Decorator) 动态 地给一个对象 添加 一些 额外的职责 。是一种 结构式模式, 就增加功能来说,Decorator 模式相比生成子类更为灵活。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为. 装饰模式的类图如下: 在装饰模式中的角色有:   ●   抽象构件(Component)角色: 给出一个抽象接口,以规范准备接收附加责任的对象。   ●   具体构件(ConcreteComponent)角色: 定义一个将要接收附加责任的类。   ●   装饰(Decorator)角色: 持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。   ●   具体装饰( Concrete Decorator)角色: 负责给构件对象“贴上”附加的责任。 代码说明: 抽象构件角色: public interface Component{ public void sampleOperation(); } 具体挂件角色: public class ConcreteComponent implements Component{ @Override public void sampleOperation() {