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的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
总结Python编程中三条常用的技巧
May 11 Python
Python中装饰器高级用法详解
Dec 25 Python
EM算法的python实现的方法步骤
Jan 02 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
详解python 中in 的 用法
Dec 12 Python
重写django的model下的objects模型管理器方式
May 15 Python
pycharm 关掉syntax检查操作
Jun 09 Python
python3.7调试的实例方法
Jul 21 Python
Python加密技术之RSA加密解密的实现
Apr 08 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
ini_set的用法介绍
2014/01/07 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
PHP多进程简单实例小结
2019/11/09 PHP
JavaScript加强之自定义callback示例
2013/09/21 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
pycharm安装和首次使用教程
2018/08/27 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
Python检查ping终端的方法
2019/01/26 Python
浅析python中while循环和for循环
2019/11/19 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
迪奥官网:Dior.com
2018/12/04 全球购物
《圆明园的毁灭》教学反思
2014/02/28 职场文书
晚会主持词开场白
2014/03/17 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
网站创业计划书
2014/04/30 职场文书
团代会宣传工作方案
2014/05/08 职场文书
会计学习心得体会
2014/09/09 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
推普标语口号大全
2015/12/26 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
docker-compose部署Yapi的方法
2022/04/08 Servers