装饰模式

设计模式4-装饰器模式Decorator

不羁岁月 提交于 2019-11-30 04:29:14
装饰器模式属于"单一职责"模式. 在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果,往往是随着需求的变化,子类 急剧膨胀 ,同时充斥着 重复代码 ,这是代码的bad smell. 典型的单一职责模式:Decorator,Bridge.这两种模式表现出了很强的"单一职责模式的味道".本文中我们讨论Decorator模式. 动机 在某些情况下,我们可能会"过度的使用继承来扩展对象的功能",由于继承为类型引入了静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀. 如何使 对象功能的扩展 能够根据需要动态实现,同时避免 扩展功能的增多 带来的子类膨胀问题?从而使得任何 功能扩展变化 所带来的影响最低. 实例 考虑设计一个IO的库,主要是一些流操作.可以首先定义一个基类Stream, //业务操作 class Stream{ public: virtual char Read(int number)=0; virtual void Seek(int postion)=0; virtual void Write (char data)=0; ~Stream() { } }; 基于Stream可以定义文件流,网络流,内存流等派生类,然后重写实现基类的成员函数. class FileStream:public

2、python深入装饰器

别说谁变了你拦得住时间么 提交于 2019-11-29 19:13:23
装饰器两个重要的概念: ① ‘@’ 语法糖 ② 在不改变原函数代码的基础上,在执行前后进行定制操作 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为 装饰器 ,返回值是函数对象。 使用场景: 应用场景: Flask : 路由、before_request、after_request Django: csrf、缓存、内置用户登录认证 functools:缓存、warper 在一次的面试中,被面试官问过这样的两个问题: 1、你都用过装饰器实现过什么样的功能? 2、如何写一个可以传参的装饰器? 01. Hello,装饰器 装饰器的使用方法很固定 先定义一个装饰器(帽子) 再定义你的业务函数或者类(人) 最后把这装饰器(帽子)扣在这个函数(人)头上 就像下面这样子 def decorator(func): # 其中func传入要调用装饰器函数, 保留函数原有功能 def wrapper(*args, **kwargs): # wrapper 表示原函数被封装 *args, **kw 可传入多个参数 if datetime.datetime.now().year == 2020: # 新的业务逻辑 print(datetime

装饰者模式

寵の児 提交于 2019-11-29 16:03:17
装饰者模式 装饰者模式是23种设计模式之一,是指在不改变原来的类和使用继承的方式,动态的扩展这个类的功能。装饰者允许向一个现有的对象添加特定的功能却不改变它的结构。通过一个类来包装原有的类来提供额外的功能。 特点 (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。 装饰者模式的结构: Component:抽象组件,被装饰的原始对象,可以是抽象类或者接口 ConcreatCompoent:实现或者继承了抽象组件,被装饰的具体的实现 Decorator:抽象的装饰者,实现或者继承了Component抽象组件,持有抽象组件的引用 ConcreatDecotarorA、ConcreatDecotarorB:具体的装饰者,实现或者继承了抽象装饰者。 实现 举个简单的例子,假设有一个科沃斯机器人,它的基本功能是扫地,现在要求这个机器人可以边扫地边唱歌,还可以边扫地边跳舞。 那么,就可以将机器定义为一个抽象的类

Python 【web框架】之Flask

我怕爱的太早我们不能终老 提交于 2019-11-29 14:36:52
flask 是Python实现的轻量级web框架。没有表单,orm等,但扩展性很好。很多Python web开发者十分喜欢。本篇介绍flask的简单使用及其扩展。 文中示例源码已经传到github: https://github.com/ZingP/webstudy.git . 1 安装flask pip install flask 2 框架本质 flask是基于Werkzeug模块和Jinja2模板引擎实现的。前者实现了WSGI协议。我们来看一下用Werkzeug怎么实现一个web服务端: from werkzeug.wrappers import Request, Response @Request.application def hello(request): print(request) return Response('Hello Werkzeug!') if __name__ == '__main__': from werkzeug.serving import run_simple run_simple('localhost', 9000, hello)   然后运行该文件,从浏览器上访问http://localhost:9000/ 就能看到Hello Werkzeug!了。 3 快速开始 开始第一个flask: from flask import Flask

Django视图函数函数之视图装饰器

不羁岁月 提交于 2019-11-29 14:01:25
FBV模式装饰器:   普通函数的装饰器(语法糖@)   views.py 1 from django.shortcuts import render 2 3 def wrapper(f): 4 def inner(*args,**kwargs): 5 print("before") 6 ret=f(*args,**kwargs) 7 print("after") 8 return ret 9 return inner 10 11 @wrapper 12 def index(request): 13 return render(request,"index.html") CBV模式装饰器:      在CBV模式视图函数中必须先导入: from django.views import View    (1)重写父类dispatch分发方法,在分发执行每个请求响应函数前后加上相应功能为实现类比装饰器     views.py 1 from django.shortcuts import render,HttpResponse 2 from django.views import View 3 from django.utils.decorators import method_decorator 4 5 class Myview(View): 6 7 def dispatch

装饰者模式学习

陌路散爱 提交于 2019-11-29 12:20:02
感谢liuguly的文章 原文地址: http://www.blogjava.net/liuguly/archive/2010/08/31/330390.html 该模式挺难理解,想了快一晚上。。。才算有点眉目。。。然后照搬一些java.io类还有servlet里面的过滤器终于有所领悟。 使用接口实现,下面给出代码: 1 /** 2 *定义被装饰者 3 * */ 4 public interface Human { 5 public void wearClothes(); 6 public void walkToWhere(); 7 } 8 /** 9 *定义装饰者是个抽象类 10 * */ 11 public abstract class Decorator implements Human { 12 private Human human; 13 14 public Decorator(Human human) { 15 this .human = human; 16 } 17 public void walkToWhere() { 18 human.walkToWhere(); 19 } 20 public void wearClothes() { 21 human.wearClothes(); 22 } 23 } 24 /** 25 *定义三种装饰,这是第一种 26 * *

设计模式 -- 装饰器

怎甘沉沦 提交于 2019-11-29 11:33:55
装饰器模式的核心是有继承有组合,继承和组合的抽象类还是一个! 用起来就是一层层的嵌套: BaseCharacter character = new Mage(); character = new BaseDecorator(character);// character = new DecoratorHelmet(character);// character = new DecoratorShoulder(character);// character = new DecoratorBreastplate(caracter); character = new DecoratorCuish(character); character = new DecoratorGlove(character); 能不能链式写呢? public class BaseDecorator : BaseCharacter { private BaseCharacter _BaseCharacter = null; public BaseDecorator(BaseCharacter character) { this._BaseCharacter = character; } public override void Show() { this._BaseCharacter.Show(); }

简单的装饰者模式列子

北慕城南 提交于 2019-11-29 10:00:40
什么是装饰者模式 装饰者模式,是 23 种常用的面向对象软件的设计模式之一 . 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。 装饰者的作用:改写已存在的类的某个方法或某些方法 , 增强方法的逻辑 使用装饰者模式需要满足的条件 1 .增强类和被增强类实现的是同一个接口 2 .增强类里面要拿到被增强类的引用 /** * 造车的规范 */ public interface Car { void run(); }    /** * 被增强的类 */ public class Byd implements Car { @Override public void run() { System.out.println("速度70迈"); } }    /** * 增强的类 */ public class WrapperCar implements Car { private Byd byd; public WrapperCar(Byd byd) { this.byd = byd; } @Override public void run() { System.out.println("速度200迈"); } }   测试方法: public class Test { public static void main(String[] args) { Byd byd

装饰者模式

ぐ巨炮叔叔 提交于 2019-11-29 09:49:26
装饰者模式:动态地将责任附加到对象上。 若要扩展功能,装饰者提供了比继承更有弹性的替代方案(head first设计模式)。 应用场景:当原有的类不能满足我们的需求时,我们可能设计一个类去继承它,但这种做法违反了开放-关闭原则(要对扩展开放,对修改关闭。多用组合,少用继承。高内聚低耦合),会导致对象之间高度耦合,所以尽量采用组合方式而不使用继承方式去扩展新功能。 tip:目前增强类功能的手段有三种: 1、继承:特点是在编译时静态决定被增强对象的新功能。 2、装饰者模式:特点是运行时动态地扩展被增强对象的新功能。 3、动态代理:特点是通过反射获取被增强对象,再在执行相应方法时动态地扩展被增强对象的新功能。 装饰者模式的组件: Component(被装饰对象的基类,一般是抽象类或者接口) ConcreteComponent(具体被装饰对象,继承或实现Component) Decorator(装饰者抽象类或者接口,此类是为了扩充装饰类本身,实现多样化装饰而派生出来的顶层抽象装饰类,此类在某些场景下可以不用创建,会维持一个指向Component实例的引用,并拥有和Component一致的超类) ConcreteDecorator(具体装饰者) 装饰者模式组件示例: 示例一(用最常见的Java IO体系做例子): 示例二(用Mybatis源码的Executor做例子):

通俗易懂设计模式解析——装饰模式

老子叫甜甜 提交于 2019-11-29 05:44:43
前言   今天介绍的是结构型设计模式中的——装饰模式(Decorator Pattern),也是装饰器模式。装饰也就是装点修饰。例如我们对手机进行装饰,买了一个新的手机,先贴个钢化膜。在带一个壳。偶尔还在背面贴点贴纸。装一些挂件。这些等等行为也就是装饰。生活中的装饰是如此,那么编程中的装饰模式又是如何呢? 装饰模式介绍 一、 来由   在我们平常的软件系统中,经常会面临着向现有的对象添加一些新的功能或者新的职责,但是呢?又不能修改现有的类。以往常用的可能是继承来解决次问题。但是采用继承来说,随着扩展功能的增加,子类会变化的很膨胀。那么装饰器模式呢就解决这么一个问题,装饰器模式允许向一个现有的对象添加新的功能职责,同时又不改变其结构。将其功能职责划分。 二、 意图   动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 三、 案例图 四、 装饰模式代码示例 看上述案例图,装饰模式包含以下部分组成: 抽象构件角色 : 给出一个抽象接口,以规范准备接收新加的责任 具体构件角色 : 继承抽象构件角色,定义一个将要接收新加责任的类 装饰角色 : 继承抽象构件角色,包含一个构件角色对象的实例,并且实现抽象构件角色的接口 具体装饰角色 : 继承装饰角色,负责新加责任。 我们继续看手机的案例,今天新买了一个手机,需要新加钢化膜,手机壳,然后才是一个我想要的手机