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网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
Python实现的一个简单LRU cache
Sep 26 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
python+pygame简单画板实现代码实例
Dec 13 Python
Python多继承顺序实例分析
May 26 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
keras中的History对象用法
Jun 19 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
python使用shell脚本创建kafka连接器
Apr 29 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php5.3后静态绑定用法详解
2016/11/11 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
六个窍门助你提高Python运行效率
2015/06/09 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
大学生毕业自荐信
2013/10/10 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
刑事和解协议书范本
2014/11/19 职场文书
远程教育学习心得体会
2016/01/23 职场文书