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判断端口是否打开的实现代码
Feb 10 Python
如何搜索查找并解决Django相关的问题
Jun 30 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
python开启debug模式的方法
Jun 27 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
表单内同名元素的控制
2006/11/22 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python实现从ftp服务器下载文件
2020/03/03 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
捷克时尚网上商店:OTTO
2018/03/15 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
python re模块和正则表达式
2021/03/24 Python
模具设计与制造专业应届生求职信
2013/10/18 职场文书
物流仓储计划书
2014/01/10 职场文书
幼儿园家长寄语
2014/04/02 职场文书
电子专业自荐信
2014/07/01 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
考勤制度通知
2015/04/25 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js