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通过正则查找微博@(at)用户的方法
Mar 13 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
详解Django中间件的5种自定义方法
Jul 26 Python
python实现QQ批量登录功能
Jun 19 Python
Python银行系统实战源码
Oct 25 Python
Python版中国省市经纬度
Feb 11 Python
python实现四人制扑克牌游戏
Apr 22 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 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
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
php基础教程
2015/08/26 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
python导入库的具体方法
2020/06/18 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
教师党性分析材料
2014/02/04 职场文书
村干部培训方案
2014/05/02 职场文书
大学自主招生推荐信
2014/05/10 职场文书
神秘岛读书笔记
2015/07/01 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
mysql如何配置白名单访问
2021/06/30 MySQL
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技