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 相关文章推荐
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
python 性能提升的几种方法
Jul 15 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
Python之pymysql的使用小结
Jul 01 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
python中如何打包用户自定义模块
Sep 23 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
两行代码解决Jupyter Notebook中文不能显示的问题
Apr 24 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 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调用数据库的存贮过程!
2006/10/09 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
js的对象与函数详解
2019/01/21 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
Golang与python线程详解及简单实例
2017/04/27 Python
Python入门_条件控制(详解)
2017/05/16 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
wxPython实现列表增删改查功能
2019/11/19 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
解决python replace函数替换无效问题
2020/01/18 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
PyQt5实现画布小程序
2020/05/30 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
蔬菜基地的创业计划书
2014/01/06 职场文书
中秋晚会活动方案
2014/08/31 职场文书
工作检讨书怎么写
2015/01/23 职场文书