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 相关文章推荐
Python实现的检测网站挂马程序
Nov 30 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
Python 闭包的使用方法
Sep 07 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
简单了解python的break、continue、pass
Jul 08 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
Python验证码截取识别代码实例
May 16 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
Python中Selenium库使用教程详解
Jul 23 Python
python语言实现贪吃蛇游戏
Nov 13 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python装饰器decorator用法实例
2014/11/10 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
经济系大学生求职信
2013/10/01 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
参观监狱心得体会
2014/01/02 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
实习科室评语
2015/01/04 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python