举例讲解Python设计模式编程的代理模式与抽象工厂模式
作者:dongweiming 发布时间:2021-08-13 06:23:49
标签:Python,设计模式
代理模式
Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介
你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办?
class Proxy(object):
def __init__(self, subject):
self.__subject = subject
# 代理其实本质上就是属性的委托
def __getattr__(self, name):
return getattr(self.__subject, name)
class RGB:
def __init__(self, red, green, blue):
self.__red = red
self.__green = green
self.__blue = blue
def Red(self):
return self.__red
def Green(self):
return self.__green
def Blue(self):
return self.__blue
class NoBlueProxy(Proxy):
# 我在这个子代理类拦截了blue的访问,这样就不会返回被代理的类的Blue属性
def Blue(self):
return 0
if __name__ == '__main__':
rgb = RGB(100, 192, 240)
print rgb.Red()
proxy = Proxy(rgb)
print proxy.Green()
noblue = NoBlueProxy(rgb)
print noblue.Green()
print noblue.Blue()
抽象工厂模式
和简单工厂/工厂方法不同,抽象工厂可能最好理解,举个例子:
比如2个动物,猫和狗,他们都有speak和eat的function,但是很明显他们执行的结果是不同的 有个'工厂'(抽象工厂里面一个类型就是一个工厂,这点和其他模式的不同)专门帮助我们找到对应的动物做正确的操作 有个类/函数可以通过参数帮助我们找到上面的这个工厂 这就是抽象工厂
from abc import ABCMeta
class StandardFactory(object):
'''这就是那个抽象工厂'''
@staticmethod
def get_factory(factory):
'''根据参数找到对实际操作的工厂'''
if factory == 'cat':
return CatFactory()
elif factory == 'dog':
return DogFactory()
raise TypeError('Unknown Factory.')
这里帮助dog这个产品类找到应该的属性的工厂
class DogFactory(object):
def get_pet(self):
return Dog();
class CatFactory(object):
# 注意这个方法和上面的名字一样,但是返回的类不同,这就是工厂的作用
def get_pet(self):
return Cat();
# 可以认为dog和cat都是动物的一种,可以有个基类
class Pet(object):
# ABCMeta会让这个类在注册后添加很多基础抽象基类,可以看[ABCMeta](http://docs.python.org/2/library/abc.html#abc.ABCMeta)
__metaclass__ = ABCMeta
def eat(self):
pass
# Dog应该做什么就是这里
class Dog(Pet):
def eat(self):
return 'Dog food...'
class Cat(Pet):
# 这里的eat依然是同名,她们都是同样的操作,只是返回不同
def eat(self):
return 'Cat food...'
if __name__ =="__main__":
factory = StandardFactory.get_factory('cat')
pet = factory.get_pet()
print pet.eat()
# 注意这里,你只需要修改抽象工厂传入的那个参数,其他什么都不用改
factory = StandardFactory.get_factory('dog')
pet = factory.get_pet()
print pet.eat()
0
投稿
猜你喜欢
- 下面是IN条件运算符的SQL语句:SELECT column1, SUM(column2) FROM&nbs
- 下面代码的功能是为了管理任务的,大家项目中有需要用到的,尽管拿去吧。 这个东西用于可以管理任务比如:今天我要做什么,做了没有,做了就打钩。&
- 什么是结构体Go语言中没有“类”的概念,也不支持“类”的继承
- 该代码用的是paramiko模块,python版本是python2.7下面上源码# -*- coding: utf-8 -*-import
- 什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你。我俩都这
- python3的编码问题。打开python开发工具IDLE,新建‘codetest.py'文件,并写代码如下:import sysp
- 导语学习一下golang权限控制,保留一下demo代码作为参考Casbin是什么Casbin是一个强大的、高效的开源访问控制框架,其权限管理
- 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group&nb
- 今天偶尔在一个学习网站技术的地方看到一个教程,关于html代码的,刚看到咱常用到的视频播放器html标签Object,平时用到他的时候都是为
- 本文介绍了关于redux-saga中take使用方法详解,分享给大家,具体如下:带来一个自己研究好久的API使用方法.redux-saga中
- 两个文章,放在一块了。第二个比较强。====================================================
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作 ⚠️ 对象测量概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大.
- SQL Server有几个版本都在使用中——4.2, 6.0, 6.5, 7.0, 2000,以及2
- 在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息
- 前言:WebDriver提供了两个关闭浏览器的方法,一个是前边使用quit()方法,另一个是close()方法close():关闭当前窗口q
- selenium执行js优点:直接调用浏览器的环境障碍:绕过selenium监测原理:# 执行js代码bro.execute_script(
- 0.引言利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的
- #!/usr/bin/env python3# -*- coding: utf-8 -*-# File Name : gt1.py# Pur
- 扫雷是一个非常经典的WIN游戏,我们教给大家用python语言来写出这个游戏,以下是全部实例代码:#!/usr/bin/python#cod
- 下面通过三种方法给大家介绍Pycharm2020.1安装中文语言插件的方法,大家可以参考下:方法一(在搜索不到插件):1.安装好Pychar