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实现得到一个给定类的虚函数
Sep 28 Python
python利用正则表达式提取字符串
Dec 08 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
在python中pandas的series合并方法
Nov 12 Python
python面向对象法实现图书管理系统
Apr 19 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
python matplotlib包图像配色方案分享
Mar 14 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
python中加背景音乐如何操作
Jul 19 Python
详解python tcp编程
Aug 24 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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/02 日漫
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php实现的SESSION类
2014/12/02 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
什么是python的列表推导式
2020/05/26 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
全运会口号
2014/06/20 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android