简介Python设计模式中的代理模式与模板方法模式编程

这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下

代理模式

Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A)
提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介

python的例子

你先设想:一个对象提供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()

模板方法模式

不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现, 如果说策略模式,
策略模式是将逻辑封装在一个类(提到的文章中的Duck)中,然后使用委托的方式解决。
模板方法模式的角度是:把不变的框架抽象出来,定义好要传入的细节的接口. 各产品类的公共的行为
会被提出到公共父类,可变的都在这些产品子类中

python的例子  
 

# 整个例子我们要根据不同需求处理的内容

ingredients = "spam eggs apple"

line = '-' * 10

 

# 这是被模板方法调用的基础函数

def iter_elements(getter, action):

  """循环处理的骨架"""

  # getter是要迭代的数据,action是要执行的函数

  for element in getter():

   
action(element)

   
print(line)

 

def rev_elements(getter, action):

  """反向的"""

  for element in getter()[::-1]:

   
action(element)

   
print(line)

 

# 数据经过函数处理就是我们最后传给模板的内容

def get_list():

  return ingredients.split()

 

# 同上

def get_lists():

  return [list(x) for x in
ingredients.split()]

 

# 对数据的操作

def print_item(item):

  print(item)

#反向处理数据

def reverse_item(item):

  print(item[::-1])

 

# 模板函数

def make_template(skeleton, getter, action):

  # 它抽象的传入了 骨架,数据,和子类的操作函数

  def template():

   
skeleton(getter, action)

  return template

 

# 列表解析,数据就是前面的2种骨架(定义怎么样迭代),2个分割数据的函数,正反向打印数据的组合

templates = [make_template(s, g, a)

     
for g in (get_list, get_lists)

     
for a in (print_item, reverse_item)

     
for s in (iter_elements, rev_elements)]

 

# 执行

for template in templates:

  template()

简介Python设计模式中的代理模式与模板方法模式编程的更多相关文章

  1. 设计模式(二十二)模板方法模式 Template

    泡茶?泡咖啡? 我们用泡茶和泡咖啡两种行为来引入这一设计模式. 思考一下“泡茶”的过程: 煮水 -> 用沸水泡茶叶 -> 把茶倒进杯子 -> 放点柠檬之类的佐料. 然后再看一下“泡咖 ...

  2. Android设计模式之命令模式、策略模式、模板方法模式

    命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...

  3. [Python设计模式] 第13章 造小人——建造者模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚 ...

  4. Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  5. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  6. 设计模式---组件协作模式之模板方法模式(Tempalte Method)

    前提:组件协作模式 现代软件专业分工之后的第一个结构是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常见的模式. 我们常常使用框架来写自己的 ...

  7. Android设计模式(八)--模板方法模式

    到国美面试Android的时候.问我的设计模式相关的问题: 1.单例模式的意义时什么. 2.有哪几种工厂方法模式: 3.你用过的模板方法模式.举例说明: 自己感觉答的一塌糊涂. 模板方法模式都没说出来 ...

  8. 设计模式——Spring IoC中用到的模板方法模式

    基本概念 什么是模板方法(Template method):父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现. 最大的好处:代码复用,减少重复代码.除了子类要实现的特定方法,其他方法及方法 ...

  9. 设计模式17---设计模式之模板方法模式(Template Method)(行为型)

    1.场景模拟 使用软件模拟登录控制,普通用户和工作人员用户,工作人员的密码在数据库中是加密的. 步骤大致如下: 前台提交,后台获取登录信息,同数据库中的登陆信息进行比较,只不过工作人员是加密的,普通用 ...

随机推荐

  1. PostgreSQL 多版本的实现与Innodb和oracle的差别

    PostgreSQL与oracle或InnoDB的多版本实现最大的区别在于最新版本和历史版本是否分离存储,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分离了数据,索引 ...

  2. CF938D Buy a Ticket dijkstra

    考试T1,建一个反图跑一个最短路就好了~ code: #include <bits/stdc++.h> #define ll long long #define N 200002 #def ...

  3. TensorFlow(一):准备

    我的环境:win10+python3.6.4(64位) 一:安装python 根据自己的电脑下载python(32位或者64位)-->安装教程 安装好python后记得配置pip源,使用官方的源 ...

  4. 爬虫(七):爬取猫眼电影top100

    一:分析网站 目标站和目标数据目标地址:http://maoyan.com/board/4?offset=20目标数据:目标地址页面的电影列表,包括电影名,电影图片,主演,上映日期以及评分. 二:上代 ...

  5. Selenium操作Chrome模拟手机浏览器

    目录 使用指定设备 使用自定义设备 在使用Chrome浏览网页时,我们可以使用Chrome开发者工具模拟手机浏览器,在使用Selenium操作Chrome时同样也可以模拟手机浏览器.主要有以下两种用途 ...

  6. PHP 之去除代码中的注释

    测试文件代码如下: <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/10/16 * Time: 10:25 */ // 计算 ...

  7. ubuntu dnsmasq

    /var/run/NetworkManager/resolv.conf 而你真实的dns服务器地址,是被这个服务管理维护着的/ local process -> local dnsmasq -& ...

  8. Oracle sql 复习题目总结

    sql 题目一 表结构 1.表名:g_cardapply 字段(字段名/类型/长度): apply_no varchar8; //申请单号(关键字) apply_date date; //申请日期 s ...

  9. Macbook上打开多个终端的方法

    方法有如下两种 1.首先是的焦点在终端上(使用鼠标点击下终端).然后使用快捷键command+N 即可得到另一个终端界面. (如果现在光标的焦点在浏览器上,那么就是新打开一个浏览器窗口) 2.同样,光 ...

  10. MAC常用快捷键 基本常用的都整理在这里了

    写在前面Mac系统中有几个比较特殊的功能键,和Win系统的区别也主要在这里比如在Win系统中我们常用的Ctrl键,在Mac系统中对应的不是长得比较像的Cnotrol,而是Command键,貌似也是Ma ...