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标准库之随机数 (math包、random包)介绍
Nov 25 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
python列表list保留顺序去重的实例
Dec 14 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Python气泡提示与标签的实现
Apr 01 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
python安装第三方库如xlrd的方法
Oct 31 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
详解matplotlib绘图样式(style)初探
Feb 03 Python
解决python的空格和tab混淆而报错的问题
Feb 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
Zend公司全球首推PHP认证
2006/10/09 PHP
php foreach 参数强制类型转换的问题
2010/12/10 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
基于php权限分配的实现代码
2013/04/28 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
composer.lock文件的作用
2016/02/03 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
js 操作符汇总
2014/11/08 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
横向对比分析Python解析XML的四种方式
2016/03/30 Python
python实现维吉尼亚算法
2019/03/20 Python
详解Python中is和==的区别
2019/03/21 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
学生处主任岗位职责
2013/12/01 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
积极向上的团队口号
2014/06/06 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python