Python笔记之facade模式


Posted in Python onNovember 20, 2019

facade模式,即门面模式,也称外观模式,这个模式的核心思想是使用facade对象为外部客户端提供一个统一的访问一组子系统的接口,即客户端不会直接与各个子系统交互,而是通过facade对象与各个子系统进行通信并使用子系统的相应功能。

可以通过下面这个图来理解facade模式:

Python笔记之facade模式

子系统:各个子系统原则上都是独立存在的,互不干涉的,重要的是它们都不会去关注facade对象,更不会去引用facade对象。

facade:facade对象负责将各个子系统组合成在一起,并为外部提供一个“舒适的外观”和访问接口。

客户端:客户端通过facade对象去和各个子系统进行交互,不会直接去和各个子系统打交道。

简单示例:

class Shampoo:
 """子系统:卖各种洗发露"""
 def __init__(self):
  print('We sell all kinds of shampoo!')

 def piaorou_500ml(self, number):
  print('This is 500ml piaorou shampoo! Total: %d' % number)


class WashingPowder:
 """子系统:卖各种洗衣粉"""
 def __init__(self):
  print('We sell all kinds of washing powder!')

 def libai_3kg(self, number):
  print('This is 3kg libai washing powder! Total: %d' % number)


class Tissue:
 """子系统:卖各种抽纸"""
 def __init__(self):
  print('We sell all kinds of tissue!')

 def jierou_200sheets(self, number):
  print('This is 200 sheets tissue! Total: %d' % number)


class Salesman:
 """facade:售货员"""
 def __init__(self):
  self.shampoo = Shampoo()
  self.washing_powder = WashingPowder()
  self.tissue = Tissue()
  print('What can I help you?')

 def sale_for_family(self):
  """家庭套餐"""
  self.shampoo.piaorou_500ml(1)
  self.washing_powder.libai_3kg(2)
  self.tissue.jierou_200sheets(6)


class UncleLi:
 """客户端:李大爷"""
 def __init__(self):
  print('I want bug something!')

 def buy_for_family(self):
  """直接从售货员那里购买家庭套餐"""
  sale_man = Salesman()
  sale_man.sale_for_family()

其他与facade模式思想相近的编程原则也可以参考下,但需要注意的是“原则”本身需要根据具体情况来灵活应用,而不是一定要这么做:

最少知识原则:最少知识意味着需要尽量减少对象之间的交互,但是也需要注意以下几点:

  • 在设计系统时,在创建每个对象时,都需要多考查下会与之交互的类的数量以及交互的方式。
  • 避免多个对象彼此紧密耦合的情况。

迪米特法则:它是一个设计准则,包含以下几点:

  • 每个单元对系统中其他单元知道得越少越好。
  • 每个单元只与其朋友交流。
  • 单元不应该知道它操作的对象的内部细节。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
Python实现Kmeans聚类算法
Jun 10 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
Python 3.8新特征之asyncio REPL
May 28 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
python 抓取知乎指定回答下视频的方法
Jul 09 Python
对Python 字典元素进行删除的方法
Jul 31 Python
Python程序慢的重要原因
Sep 04 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 Python
将python安装信息加入注册表的示例
Nov 20 #Python
如何使用Python脚本实现文件拷贝
Nov 20 #Python
Python笔记之代理模式
Nov 20 #Python
Python Tkinter模块 GUI 可视化实例
Nov 20 #Python
Python笔记之观察者模式
Nov 20 #Python
django 实现celery动态设置周期任务执行时间
Nov 19 #Python
python调用接口的4种方式代码实例
Nov 19 #Python
You might like
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
js实现详情页放大镜效果
2020/10/28 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
selenium + python 获取table数据的示例讲解
2018/10/13 Python
Python如何访问字符串中的值
2020/02/09 Python
如何基于线程池提升request模块效率
2020/04/18 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
AJAX的全称是什么
2012/11/06 面试题
合同专员岗位职责
2013/12/18 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
社区助残日活动总结
2014/08/29 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS