装饰模式

Dubbo-SPI

我的未来我决定 提交于 2020-01-20 18:14:43
前言 Dubbo 支持多种传输协议,可以有多种注册中心等等高扩展的功能,其原因就是 Dubbo SPI 提供的良好的扩展性,可以给开发者自己实现多样丰富的功能。Dubbo SPI在Java SPI的基础上发展而来,和Java SPI 一样,都是典型的 策略模式 实现,本文就主要介绍 Dubbo SPI 的使用方式和源码分析。 结合代码能够更深了解本文的内容,代码github地址:https://github.com/mikasaco/dubbo-study.git Dubbo SPI 和 Java SPI 的比较 Java SPI 的使用方式可以 参考博客 Dubbo SPI 相比于 Java SPI 有以下 3 个 优势: Java SPI 每次都会把所有实现类都加载并实例化(是在迭代器迭代的时候创建实例),而 Dubbo SPI 是分两段创建实例,先进行类加载,然后在使用到具体实现的时候才实例化,并且 Dubbo SPI 大量使用缓存,会把 Class 对象和实例对象都缓存起来,性能更好; Java SPI 在类加载失败的时候难以定位异常; Dubbo SPI 还支持 IOC 和 AOP 。 补充一下JVM的类加载机制 类加载大的上来分有 加载、连接、初始化 3 个步骤。经常会误把加载等同于类加载,把加载包含初始化。 加载是把 class 文件读到方法区,并创建一个 Class

关于代理模式和装饰模式的一些思考

☆樱花仙子☆ 提交于 2020-01-20 12:54:01
文章目录 背景 代理模式概述 装饰模式概述 编程启示录 背景 笔者前几天看了一个面试题 “说一下什么是代理模式?”,于是回忆了一下这个设计模式,并结合一篇旧文 《理理 Java 开发中常见的设计模式》 ,温故了一下这个知识点。 十年前看了好多遍的设计模式,死活处于学了忘、学不会的状态;如今随便翻到的某个 Java 技术点,都能快速反应出它们的前因后果。时光如梭,毕业已经十年了,这大概算是进入了卖油翁纯熟的技艺阶段了吧! 代理模式概述 代理模式类图 。面向对象编程语言中,代理对象和委托对象都需要实现相同接口,同时代理对象关联一个真正的委托对象,客户端得到的是一个代理的引用,实则背后调用的是真正委托对象的方法: 代理类型。 对于有大量类需要代理的应用,这就是一种负担。一方面增加了工作量,而且还产生了大量相似的代理类,所以有了动态代理这个解决方案:不需要为每个类都创建一个代理类,只在需要使用代理的时候,通过反射机制动态地生成一个实现代理接口的匿名类的实例。代理的分类:动态代理和静态代理,即生成代理类的方式是什么。 动态代理的两种类型:JDKProxy 和 CGlib 两种,二者比对结果如下 类型 原理 特点 JDKProxy 运行时直接写Class字节码 生成代理类效率高,反射执行效率低 CodeGeneratorLibrary ASM框架写 Class 字节码 生成代理类效率低

大话设计模式,结构型模式之装饰器模式

邮差的信 提交于 2020-01-19 22:27:43
结构型模式概述 结构型模式概述 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 模式动机及定义 模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)。 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。 模式定义 装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活

装饰器模式

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-18 19:20:34
装饰器模式 创建一个装饰类,用来包装原有的类,在保证不改变其结构完整的情况下,提供额外的功能。 介绍 意图 :动态的为类增加新的功能。 使用场景 :在不想增加许多子类的情况下扩展类。 关键代码 : Component类充当抽象角色,不应该是具体实现。 修饰类引用和继承Component类,具体扩展类重写父类方法。 优点 :装饰类和被装饰类相互独立,不会相互耦合,是继承的一个替代模式,动态的对类的功能进行扩展,更加的灵活。 缺点 :多层装饰比较复杂 使用: // 接口 /** * 英雄接口 * @author 98543 */ public interface Hero { public void learnSkill(); } // 被修饰类 /** * 具体英雄 * @author 98543 */ public class BlindMonk implements Hero{ protected String name; public BlindMonk(String name) { this.name = name; } @Override public void learnSkill() { System.out.println(name+"学习了以上技能"); } } // 抽象修饰器 /** * 抽象修饰类 * @author 98543 */ public

scrapy模块

淺唱寂寞╮ 提交于 2020-01-18 11:33:53
python其他知识目录 python基础知识-1 1、typora软件使用 2、python解释器安装 3、Python解释器环境变量添加 4、计算机编码知识: 5、输出print(): 6、变量 7、输入input(): 8、注释 python基础知识-2 1、循环打印“我是小马过河” #4、用while从一打印到10 #5、请通过循环,1 2 3 4 5 6 8 9 10 #6、while else 结构 #7、格式化输出 #8、打印1-100的奇数 #9、求和1-100 #10、计算1-10中,除1外,偶数减奇数 #11、求方, #12、求开方 #13、逻辑运算 与或非 #14、数据类型转换 #15、value=1 or 9 (and,or,not) or and python基础知识-3 1、for循环遍历字符串中单个字符 2、#计算字符串长度 3、#字符串索引 4、#让用户输入任意字符串,获取字符串之后并计算其中有多少个数字isdigit() 5、#索引取值,从前向后,从后向前取。 6、#切片和索引 7、#字符串操作split,#有时间添加awk的切割做对比 8、#字符串操作isdigit使用 9、#字符串操作upper和lower 10、#字符串操作strip(),lstrip(),rstrip() Python基础知识-4 1、字符串操作 1

12步轻松搞定python装饰器

情到浓时终转凉″ 提交于 2020-01-18 10:40:14
12步轻松搞定python装饰器 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂。搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点。 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点。因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数: >>> def foo(): ... return 1 >>> foo() 1 方法体(当然多行也是一样的)是必须的,通过缩进来表示,在方法名的后面加上双括号()就能够调用函数 2. 作用域 在python中,函数会创建一个新的作用域。python开发者可能会说函数有自己的命名空间,差不多一个意思。这意味着在函数内部碰到一个变量的时候函数会优先在自己的命名空间里面去寻找。让我们写一个简单的函数看一下 本地作用域 和 全局作用域有什么不同: >>> a_string = "This is a global variable" >>> def foo(): ... print

python 装饰器

浪子不回头ぞ 提交于 2020-01-18 10:38:09
[译] 12步轻松搞定python装饰器 字数6504 阅读7477 评论12 喜欢49 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂。搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点。 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点。因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数: >>> def foo(): ... return 1 >>> foo() 1 方法体(当然多行也是一样的)是必须的,通过缩进来表示,在方法名的后面加上双括号()就能够调用函数 2. 作用域 在python中,函数会创建一个新的作用域。python开发者可能会说函数有自己的命名空间,差不多一个意思。这意味着在函数内部碰到一个变量的时候函数会优先在自己的命名空间里面去寻找。让我们写一个简单的函数看一下 本地作用域 和 全局作用域有什么不同: >>> a_string = "This is a global

python文章装饰器理解12步

感情迁移 提交于 2020-01-18 10:36:01
1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数: def foo(): return 1 foo() 1 方法体(当然多行也是一样的)是必须的,通过缩进来表示,在方法名的后面加上双括号()就能够调用函数 2. 作用域 在python中,函数会创建一个新的作用域。python开发者可能会说函数有自己的命名空间,差不多一个意思。这意味着在函数内部碰到一个变量的时候函数会优先在自己的命名空间里面去寻找。让我们写一个简单的函数看一下 本地作用域 和 全局作用域有什么不同: a_string = "This is a global variable" def foo(): print locals() print globals() # doctest: +ELLIPSIS {, 'a_string': 'This is a global variable'} foo() # 2 {} 内置的函数globals返回一个包含所有python解释器知道的变量名称的字典(为了干净和洗的白白的,我省略了python自行创建的一些变量)。在#2我调用了函数 foo 把函数内部本地作用域里面的内容打印出来。我们能够看到,函数foo有自己独立的命名空间,虽然暂时命名空间里面什么都还没有。 3.

python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)

谁说我不能喝 提交于 2020-01-18 10:34:32
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂。搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点。 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点。因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数: def foo(): return 1 foo() 1 方法体(当然多行也是一样的)是必须的,通过缩进来表示,在方法名的后面加上双括号()就能够调用函数 2. 作用域 在python中,函数会创建一个新的作用域。python开发者可能会说函数有自己的命名空间,差不多一个意思。这意味着在函数内部碰到一个变量的时候函数会优先在自己的命名空间里面去寻找。让我们写一个简单的函数看一下 本地作用域 和 全局作用域有什么不同: 1 a_string = "This is a global variable" 2 def foo(): 3 print

什么是装饰者模式?

天大地大妈咪最大 提交于 2020-01-17 05:50:51
一、定义 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。 二、角色 抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象。 具体构件角色(Employe):定义一个将要接收附加责任的类。 装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。 具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任。 三、示例 1.公共接口: public interface Person { void eat(); } 2.被装饰对象: public class OldPerson implements Person { @Override public void eat() { System.out.println("吃饭"); } } 3.装饰对象: public class NewPerson implements Person { private OldPerson p; NewPerson(OldPerson p) { this.p = p; } @Override public void eat() { System.out.println("生火"); System.out.println("做饭"); p.eat