python设计模式之门面模式
一.结构型设计模式
门面模式与单例模式,工厂模式不同,它是一种结构型模式。
- 结构型模式描述如何将对象和类组合成更大的结构
- 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之间的关系。
- 结构型模式是类和对象模式的综合体。类模式通过继承来描述抽象,从而提供更有用的程序接口,而对象模式描述了如何将对象联系起来从而组合成更大的对象。
二.理解门面设计模式
- 它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更简单的方式使用子系统。
- 门面所解决的问题是,如何用单个接口对象来表示复杂的子系统,它实际上并不是封装子系统,而是对底层子系统进行组合。
- 它促进实现子系统与客户端的解耦。
通过这三条内容,还是难以理解门面模式具体的理念,我们借助一个UML图来理解:
这里面有三个参与者,门面,客户端,系统
客户端:客户端实例化门面类,并向门面提出要求,去让子系统完成相应的功能
门面:门面接到客户端的请求,去判断该由哪些子系统完成工作,并且安排给他们任务。
系统:系统处理门面对象分配的任务,完成工作
简单理解:整个模式的执行方式就是,门面接收客户端的需求,去安排系统完成工作。用一个简单的例子举例:去快餐店,我们向服务员点了一份xx套餐,套餐里有一杯冰可乐,一个汉堡,一份薯条,这时服务员听到你的点餐后,扭头告诉后厨需要一份xx套餐,于是后厨有三个人开始行动,一个做可乐,一个做汉堡,一个做薯条。这个例子里,你就是客户端,服务员为门面,后厨的三个人做东西为三个子系统,他们组合合作完成这份套餐的制作。这样看来,门面模式的理解便非常简单了
三.python实现门面模式
就用上述快餐店点餐的例子
class Client():
def order(self):
Waiter().make_set_meal1()
class Waiter():
def make_set_meal_1(self):
Coke().make()
Hamburger().make()
French_fries().make()
class Coke():
def make(self):
print('making coke')
class Hamburger():
def make(self):
print('making hamburger')
class French_fries():
def make(self):
print('making french fries')
you=Client()
you.order()
'''
making coke
making hamburger
making french fries
'''
这里的make_set_meal_1,做套餐1,也就是让子系统的组合完成任务,将这个复杂的组合封装了起来。当然可能还有其他类型的套餐,那么Waiter里还可以添加其他的方法,但是这与子系统没有太大的联系,只是增加了又一种组合,例如只点可乐和汉堡的套餐,只需要增加Waiter的方法,不需要修改子系统。
四.最少知识原则
门面模式背后的设计原理就是最少知识原则,它的理念为减少对象之间的交互,这意味着:
- 对于设计系统时创建的每个对象,都应该考察与之交互的类的数量以及交互的方式
- 这样能够避免创建许多彼此紧密耦合的类,如果类与类之间存在大量的依赖关系,那么对于系统的任何一部分的修改都有可能导致系统的其他部分无意的被改变。
参考《python设计模式(第2版)》
python设计模式之门面模式的更多相关文章
- python 设计模式之门面模式
facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库. 门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...
- Python设计模式之MVC模式
# -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...
- python设计模式之模板模式
python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...
- python设计模式之状态模式
python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...
- python设计模式之解释器模式
python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- python设计模式之外观模式
python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...
- python设计模式之原型模式
python设计模式之原型模式 对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中就包含两个方面:1.浅复制:2.深复制.具体的区别请看我相关的随笔.这里简略的说明一下,浅复制就等于对 ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
随机推荐
- 第一个 smarty 程序
原来使用普通的 PHP 代码,只需要一个文件,就可以完成功能. 而使用了 smarty后,会分成两个文件来完成,一个是模板文件,用于显示内容,一般后缀名为 *.tpl (但实际上任何后缀名都可以,建议 ...
- maven jetty debug 无法关联第三方类库解决办法
http://ifedorenko.github.com/m2e-extras/
- CRM项目分析建表
这个CRM项目是我们学习一年多以来,第一次团队合作完成的项目!之前的项目都是做半个月的,但是都是自己单独完成一套项目的!这次我们还是做半个月的!但是我们是分工合作的!自己所完成的内容都是不同的!我觉得 ...
- Python制作回合制手游外挂简单教程(上)
引入: 每次玩回合制游戏的时候,反反复复的日常任务让人不胜其烦 玩问道的时候,我们希望能够自动刷道,玩梦幻希望能自动做师门.捉鬼等等 说明: 该外挂只能模拟鼠标键盘操作,并不能修改游戏数据 我这里使用 ...
- POJ 1730 Perfect Pth Powers(暴力枚举)
题目链接: https://cn.vjudge.net/problem/POJ-1730 题目描述: We say that x is a perfect square if, for some in ...
- C# 如何判断ie版本号和获取注册表中的信息
1.获取ie版本号 string ver = (new WebBrowser()).Version.ToString(); 例如:11.0.10586.103 int mainVer = (new W ...
- ASP.NET MVC呼叫WCF Service的方法
本演示,Insus.NET操练asp.net mvc的应用程序,虽然以前有写过:<MVC应用程序使用Wcf Service>http://www.cnblogs.com/insus/p/3 ...
- C# 导出Excel表格
function exportExcel() { //查询条件 var startTime = F.ui.startTime.getText() == "" ? null : F. ...
- [日常] Go语言圣经--接口约定习题
Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...
- 36.Linux驱动调试-根据oops定位错误代码行
1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2 ...