装饰模式

python 单例装饰器

纵然是瞬间 提交于 2019-11-30 17:56:54
Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性。 单例模式定义:具有该模式的类只能生成一个实例对象。 def singlecls(cls, *args,**kwargs):   instace = {}   def get_instance(cls, *args, **kwargs):     if cls not in instace:       instances[cls] = cls(*args, **kwargs)     return instance[cls]   return get_instace      @singlecls class A(object):   def __init__(self):     pass A = singlecls(A) 在创建实例对象时会先将 A 作为参数传入到 singlecls 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。 此时可以看作 A = get_instance,创建实例时相当于 a= get_instance(),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回, 如果不在执行 instances

装饰者模式

瘦欲@ 提交于 2019-11-30 17:05:39
装饰者模式能够动态地将责任附加到对象上,在扩展对象功能方面比继承更加灵活,具体来说,装饰者模式将行为委托给相应的包装对象,并添加上自己的对应逻辑来实现特定的功能。装饰者模式的UML图如下: 首先需要有被装饰的组件接口和具体组件,然后有装饰者对象,由于装饰者对象需要能够代替组件,所以要继承组件接口,并组合组件对象来完成委托任务。 下面以一个简单的快餐店为例子来介绍装饰者模式的用法。快餐店会有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样。按照上面的UML类图,先定义组件接口(快餐)和具体组件(炒饭、炒面)。 1 //快餐接口 2 public interface FastFood { 3 float getCost(); //获取价格 4 String getDescription(); //获取描述 5 } 6 7 //炒饭 8 public class FriedRice implements FastFood{ 9 private float price = 5; 10 String description = "炒饭"; 11 @Override 12 public float getCost() { 13 return this.price; 14 } 15 16 @Override 17 public

装饰器模式

南笙酒味 提交于 2019-11-30 14:45:20
装饰器模式(decorate):可以在程序运行中,为对象动态的增加功能(不修改业务类,可以随意的添加功能,还可以随意调整顺序)。(组合+继承。两种方式的结合) static void Main(string[] args) { AbstractStudent student = new CommonStudent() { ID = 9527, Name = "stephen" }; student = new StudentVip(student); } public abstract class AbstractStudent { public int ID { get; set; } public string Name { get; set; } public abstract void Study(); } public class StudentVip : AbstractStudent//这里用到了继承 { AbstractStudent _student; public StudentVip(AbstractStudent s)//这里是组合 { this._student = s; } public override void Study() { Console.WriteLine("我是VIP,我可以加点一般学员没有的功能在这里!"); this._student

C++装饰器模式

∥☆過路亽.° 提交于 2019-11-30 12:50:37
UML图: 1 #include <iostream> 2 #include <string> 3 #include <windows.h> 4 using namespace std; 5 //抽象类Cake 6 class Cake 7 { 8 public: 9 string m_name; 10 //如果一个类中有纯虚函数 11 //那么这个类无法被实例化 12 //需要先继承再实例化 13 virtual void show() = 0; 14 }; 15 class ConcreteCake:public Cake 16 { 17 public : 18 ConcreteCake() 19 { 20 m_name = "原始蛋糕"; 21 } 22 23 virtual void show() 24 { 25 cout << m_name.c_str() << endl; 26 } 27 28 }; 29 //抽象类Decorator 30 class Decorator :public Cake 31 { 32 public : 33 Cake * pCake; 34 virtual void show() = 0; 35 }; 36 //具体奶油类 37 class DecCream :public Decorator 38 { 39 public : 40

python之函数:二

允我心安 提交于 2019-11-30 12:37:25
本文从以下几个方面入手更多了解python函数: 函数中的变量作用域 函数中的闭包现象 函数中的装饰器 标准库中的装饰器 叠加装饰器 参数化装饰器模式 def A(func):   def B():      return   return B 函数中的LEGB原则:即本地作用域->外部作用域->全局作用域->到此就可以了...       对于函数B而言 B的函数体叫本地作用域,A的函数体叫B的外部作用域,A所在的文件是B的全局作用域       如果需要在B中进行全局变量的修改q请使用global关键字对变量进行申明 函数中的闭包:     对于B的函数体能够调用A作用域下的变量 c的行为称为闭包 标准的定义:非全局作用域下的函数能够记住它被命名的封闭空间(B封闭于A)     其中变量Cc称之为自由变量 :指未在本地作用域中绑定的变量 q其中使用nonlocal去申明自由变量 (如同global)      装饰器:     定义:能够增强函数的行为 在目标函数前执行l另一个函数对目标函数进行修饰     表现:形如ex就是一个装饰器     使用: @A        def target():           pass 参数化装饰器:都知道装饰器接受目标函数的函数名作为参数进行传递,那么如果被装饰的目标函数带有参数怎么办?        在装饰器外面在嵌套一层函数

Django基础三之视图函数

╄→гoц情女王★ 提交于 2019-11-30 12:29:41
本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Django的视图函数view      一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。   响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。   无论视图本身包含什么逻辑,都要返回响应。 代码写在哪里也无所谓,只要它在你当前项目目录下面。 除此之外没有更多的要求了——可以说“没有什么神奇的地方”。 为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为 views.py 的文件中。   一个简单的视图   下面是一个以HTML文档的形式返回当前日期和时间的视图: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)   让我们来逐行解释下上面的代码:

Django基础三之视图函数

若如初见. 提交于 2019-11-30 12:24:43
目录 一Django的视图函数view 二CBA和FBV 三使用Mixin 四 给视图加装饰器 4.1使用装饰器装饰FBV 4.2使用装饰器装饰CBV 五request对象 六 response对象 6.1JsonResponse对象 一Django的视图函数view ​ 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 ​ 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。   无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为 views.py 的文件中。 一个简单的视图 下面是一个以HTML文档的形式返回当前日期和时间的视图: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return

装饰者模式,从吃黄焖鸡开始说起

本秂侑毒 提交于 2019-11-30 07:17:53
黄焖鸡米饭最热卖的外卖之一,国人都喜欢吃,吃过黄焖鸡米饭的应该都知道,除了黄焖鸡米饭主体外,还可以添加各种配菜,如土豆、香菇、鹌鹑蛋、青菜等。如果需要你来设计一套黄焖鸡米饭结账系统,你该如何设计呢? 前置条件:主体:黄焖鸡米饭 价格:16,配菜:土豆 价格:2、香菇 价格:2、鹌鹑蛋 价格:2、青菜 价格:1.5 这还不简单?看我的,你随手就来了下面这段代码。 public class HuangMenJiMiFan { // 黄焖鸡价格 private double huangMenJiPrice = 16D; // 土豆价格 private double potatoPrice = 2D; // 鹌鹑蛋价格 private double eggPrice = 2D; // 香菇价格 private double mushroomPrice = 2D; // 青菜价格 private double vegPrice = 1.5D; // 总价格 private double totalPrice = 0D; // 订单描述 private StringBuilder desc = new StringBuilder("黄焖鸡米饭 "); // 是否加土豆 private boolean hasPotato = false; // 是否加鹌鹑蛋 private boolean

03.Django基础三之视图函数

偶尔善良 提交于 2019-11-30 06:32:51
一 Django的视图函数view      一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。   响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。   无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为 views.py 的文件中。 一个简单的视图   下面是一个以HTML文档的形式返回当前日期和时间的视图: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)   让我们来逐行解释下上面的代码: 首先,我们从 django.http 模块导入了 HttpResponse 类,以及Python的 datetime 库。 接着,我们定义了 current

设计模式之装饰者模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 05:58:05
  今天我们来学习一下装饰者模式。作为一名程序猿,相信许多人都跟我一样,在平时写代码的过程中,习惯使用继承。但是继承有时候会出现非常严重的问题,不过,没担心。装饰者模式将会给爱用继承的我们一个全新的设计眼界! 一、星巴兹咖啡的故事   我们通过一个生动有趣的例子来引出我们今天的主角--装饰者模式。    1、 现在呢,有一个咖啡馆,它有一套自己的订单系统,当顾客来咖啡馆的时候,可以通过订单系统来点自己想要的咖啡。他们原先的设计是这样子的:    2、 此时、咖啡馆为了吸引更多的顾客,需要在订单系统中允许顾客选择加入不同调料的咖啡,例如:蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力风味)或覆盖奶泡。星巴兹会根据所加入的调料收取不同的费用。所以订单系统必须考虑到这些调料部分。   下面是他们的第一次尝试:   这种设计肯定是不行的,简直分分钟把人逼疯的节奏,有木有!    3、 这时,有个人提出了新的方案,利用实例变量和继承,来追踪这些调料。     具体为:先从Beverage基类下手,加上实例变量代表是否加上调料(牛奶、豆浆、摩卡、奶泡……),      这种设计虽然满足了现在的需求,但是我们想一下,如果出现下面情况,我们怎么办,     ①、调料价钱的改变会使我们更改现有代码。     ②、一旦出现新的调料,我们就需要加上新的方法