装饰模式

设计模式-装饰模式 策略模式

余生颓废 提交于 2019-12-29 11:52:20
装饰模式 装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:   Component为统一接口,也是装饰类和被装饰类的基本类型。 ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。 Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。 ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。 //房屋基础接口 public interface House { void run(); } //房屋装饰类 public class HouseDecorate implements House { private House house; public HouseDecorate(House house){ this.house=house; } @Override public void run() { house.run();

02函数整合篇

只谈情不闲聊 提交于 2019-12-28 13:14:36
目录 前言 函数 函数的简介 函数的结构与调用 函数的返回值 函数的参数 万能参数,仅限关键字参数 *的魔性用法。 名称空间作用域 高阶函数 内置函数 globals locals global nonlocal关键字 函数名的应用 默认参数的坑 可迭代对象和迭代器 while模拟for循环 可迭代对象与迭代器的对比 可迭代对象与迭代器的对比 生成器 yield from 出错题 生成器表达式,列表推导式,字典推导式 匿名函数 小练习 内置函数 内置函数 I 了解 callable 判断是否可调用 bin oct hex进制转换 all any判断是否全部为真或假 内置函数II 重要 sep 设定分隔符。 end去除默认换行 sum() 数字相加求和 min max()可以加功能 reversed() 将一个序列翻转 sorted排序函数 可以加key map对元素进行映射 zip() 拉链方法 filter筛选过滤 返回迭代器 闭包 装饰器 标准版的装饰器; 带参数的装饰器 多个装饰器装饰一个函数 递归 前言 本篇博客整合了以下与函数有关的知识点 函数 函数的简介 # 函数:以功能(完成一件事)为导向,登录,注册,len,一个函数就是一个功能。 随调随用。 # 减少代码的重复性。 # 增强了代码的可读性。 函数的结构与调用 定义一个函数 def len_num(a):

使用JDK动态代理实现装饰器

僤鯓⒐⒋嵵緔 提交于 2019-12-26 23:11:21
使用JDK动态代理实现装饰器 众所周知,装饰器模式和代理模式非常类似,只不过一个是为了增强功能,一个是访问控制。 最近在做一个项目,中间遇到了这么一个需求,在运行时动态的给一个类新增接口。 假设现有的类A是接口 IA 的实现,期望其能够增加接口 IB 的实现,为了使用 IB 的方法,首先需要先实现这个方法,可以使用接口默认实现,然后声明一个匿名类实现,不过为了简单起见,创建了一个类 B,其实现了接口 IB。 class Main { static interface IA { void a ( ) ; } static interface IB { void b ( ) ; } static class A implements IA { @Override public void a ( ) { System . out . println ( "a" ) ; } } static class B implements IB { @Override public void b ( ) { System . out . println ( "b" ) ; } } public static void main ( String [ ] args ) { A a = new A ( ) ; B b = new B ( ) ; Class < ? > [ ] interfaces =

C# Design Patterns (3) - Decorator

雨燕双飞 提交于 2019-12-26 19:42:54
本帖介绍 Decorator Pattern (装饰模式),文章最后另提供 Decorator Pattern 的趣味四格漫画。 -------------------------------------------------------- 本帖的示例下载点: http://files.cnblogs.com/WizardWu/090629.zip 第一个示例为 Console Mode (控制台应用程序) 项目,第二个示例为 ASP.NET 网站项目。 执行第二个示例需要 Visual Studio 或 IIS,不需要数据库。 -------------------------------------------------------- Decorator Pattern (装饰模式) 装饰模式可「动态」地给一个对象添加一些额外的职责,提供有别于「继承」的另一种选择。就扩展功能而言,Decorator Pattern 透过 Aggregation (聚合) 的特殊应用,降低了类与类之间的耦合度,会比单独使用「继承」生成子类更为灵活。 一般用「继承」来设计子类的做法,会让程序变得较僵硬,其对象的行为,是在「编译」时期就已经「静态」决定的,而且所有的子类,都会继承到相同的行为;然而,若用「装饰模式」以及 UML 的 Aggregation 的设计,来扩展对象的行为,就能弹性地

JAVA---装饰者模式

…衆ロ難τιáo~ 提交于 2019-12-26 11:05:51
1、继承带来的问题 引言:说威哥当年创业开店--卖豆浆!因豆浆纯,分店几乎开遍全县城所有村,由于发展的实在是太快了,所以急 于实现一套由计算机管理的自动化记账系统。 主料:豆浆 配料:糖 黑豆 五谷 鸡蛋…, 加一样配料加钱,每种豆浆的价格都不同。不过都是基于豆浆的价格进行加价。可以加多种配料。 如果使用继承,每增加一种配料,就要新建好多好多类,比如黑豆五谷豆浆,黑豆五谷糖豆浆。会导致类爆炸! 所以直接继承的方式是不行的。 2、装饰者设计模式。 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。 适用环境: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 处理那些可以撤消的职责。 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 装饰者模式,只用新建一个配料类即可,不需要新建所有可能的子类。 涉及角色   抽象组件:定义一个抽象接口,来规范准备附加功能的类。   具体组件:将要被附加功能的类,实现抽象构件角色接口。   抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。   具体装饰:实现抽象装饰者角色

设计模式之装饰模式

只谈情不闲聊 提交于 2019-12-26 02:11:17
装饰模式 指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 结构 装饰模式的主要角色组成: 抽象类/接口(Component) :定义最核心的对象,装饰类和被装饰类的基类。 被装饰类(ConcreteComponent) :具体构件,通过继承实现Component抽象类中的抽象方法。最核心、最原始、最基本的接口或抽象类的实现。 装饰类(Decorator) :实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。 具体装饰类(ConcreteDecorator) :具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。 优缺点 优点: 装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了。 装饰模式是继承关系的一个替代方案。 装饰模式可以动态地扩展一个实现类的功能。 缺点: 多层装饰比较复杂。 代码实现 Component public interface Component {

设计模式(9)-- 装饰模式

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

Python设计模式--装饰器模式

纵然是瞬间 提交于 2019-12-25 03:16:09
import time import math from functools import wraps class Decorator(object): def __init__(self, func): self.f = func def __call__(self, *args, **kwargs): start_time = time.time() result = self.f(*args, **kwargs) print(time.time() - start_time) return result def profiling_wrapper(f): @wraps(f) def wrapper(*args, **kwargs): start_time = time.time() result = f(*args, **kwargs) print("[func_name]: ", f.__name__+'\n' + "[use_time]: ", time.time() - start_time) return result return wrapper def profiling_all_class_methods(Cls): """装饰类中所有方法""" class ProfiledClass(object): def __init__(self, *args, *

python学习之高级特性

冷暖自知 提交于 2019-12-24 16:36:19
一、生成式 1、定义 生成式就是一个用来快速生成特定语法形式的表达式。 列表生成式:用来快速生成列表 字典生成式:用来快速生成字典 集合生成式:用来快速生成集合 2、语法格式 (1)普通的语法格式:[exp for iter_var in iterable] (2)带过滤功能语法格式: [exp for iter_var in iterable if_exp] (3)循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B] 01_列表生成式.py #需求: 生成100个1~50之间的随机数值。 import random def use_list_expression(count=100, start=0, end=50): """第一种: 使用列表生成式实现需求""" return [random.randint(start, end) for count in range(count)] def use_loop(count=100, start=0, end=50): """第二种: 使用for循环与传统的方式实现需求""" nums = [] for count in range(count): num = random.randint(start, end) nums.append

23种设计模式之装饰模式

扶醉桌前 提交于 2019-12-24 12:00:04
装饰模式的定义 定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活. 通俗的说, 就是对一个类或方法进行包装 装饰模式的通用类图: 类图中的四个角色说明如下: Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心的角色, 也就是最原始的对象. 在装饰模式中, 必然有一个最基本、最核心的接口或抽象类充当 Component 抽象构件 ConcreteComponent 具体构件: ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现, 要装饰的就是它 Decorator 装饰角色: 一般是一个抽象类, 实现接口或抽象方法, 它里面不一定有抽象的方法, 在它的属性中必然有一个private变量指向Component抽象构件 具体装饰类: ConcreateDecrator是具体的装饰类, 要把最核心的、最原始的、最基本的东西装饰成其他东西. 当只有一个装饰类时, 可以没有抽象装饰角色 具体实现代码如下: 抽象装饰者代码: 具体装饰者代码: 场景类: 装饰模式应用 装饰模式的优点: 装饰类和被装饰类可以独立发展, 而不会相互耦合. 也就是说, Component 类无需知道 Decorator 类, Decorator 类是从外部来扩展 Component类的功能,