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中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
对Python 数组的切片操作详解
Jul 02 Python
python多进程读图提取特征存npy
May 21 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
Python grpc超时机制代码示例
Sep 14 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
python 三种方法提取pdf中的图片
Feb 07 Python
Python类方法总结讲解
Jul 26 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
.htaccess文件保护实例讲解
2011/02/06 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
Python去掉字符串中空格的方法
2014/03/11 Python
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
招商经理岗位职责
2013/11/16 职场文书
体育教学随笔感言
2014/02/24 职场文书
骨干教师培训方案
2014/05/06 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
经典导游欢迎词
2015/01/26 职场文书
高中教师个人工作总结
2015/02/10 职场文书
圣诞晚会主持词
2015/07/01 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫