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 14 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
关于python写入文件自动换行的问题
Jun 23 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 Python
使用python实现ftp的文件读写方法
Jul 02 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
python中remove函数的踩坑记录
Jan 04 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
中英文字符串翻转函数
2008/12/09 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
对Python _取log的几种方式小结
2019/07/25 Python
python如何操作mysql
2020/08/17 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
开门红主持词
2014/04/02 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
保送生自荐信
2015/03/06 职场文书
小学班主任心得体会
2016/01/07 职场文书
新员工入职感言范文!
2019/07/04 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书