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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
Python实现数据库编程方法详解
Jun 09 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
python适合人工智能的理由和优势
Jun 28 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
python实现学生信息管理系统源码
Feb 22 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
Python实现为PDF去除水印的示例代码
Apr 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
福利彩票幸运号码自动生成器
2006/10/09 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
PHP 类与构造函数解析
2017/02/06 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
jQuery使用方法
2017/02/04 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
vue element upload实现图片本地预览
2019/08/20 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
法学专业毕业生求职信
2014/06/12 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
甲午大海战观后感
2015/06/02 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js