一.结构型设计模式

门面模式与单例模式,工厂模式不同,它是一种结构型模式。

  • 结构型模式描述如何将对象和类组合成更大的结构
  • 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之间的关系。
  • 结构型模式是类和对象模式的综合体。类模式通过继承来描述抽象,从而提供更有用的程序接口,而对象模式描述了如何将对象联系起来从而组合成更大的对象。

二.理解门面设计模式

  • 它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更简单的方式使用子系统。
  • 门面所解决的问题是,如何用单个接口对象来表示复杂的子系统,它实际上并不是封装子系统,而是对底层子系统进行组合。
  • 它促进实现子系统与客户端的解耦。

通过这三条内容,还是难以理解门面模式具体的理念,我们借助一个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设计模式之门面模式的更多相关文章

  1. python 设计模式之门面模式

    facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库.   门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...

  2. Python设计模式之MVC模式

    # -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...

  3. python设计模式之模板模式

    python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...

  4. python设计模式之状态模式

    python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...

  5. python设计模式之解释器模式

    python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...

  6. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  7. python设计模式之外观模式

    python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...

  8. python设计模式之原型模式

    python设计模式之原型模式 ​ 对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中就包含两个方面:1.浅复制:2.深复制.具体的区别请看我相关的随笔.这里简略的说明一下,浅复制就等于对 ...

  9. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

随机推荐

  1. dubbo + zookeeper 简介和部署

    Dubbo简介: Dubbo 是阿里巴巴公司开源(以前不开源)的一个高性能优秀的服务框架, 使得应用可通过高性能的 RPC 实现服务的输入和输出功能, 可以和spring框架无缝集成. 那么这里, 啥 ...

  2. solr(四) : springboot 整合 solr

    前言: solr服务器搭起来, 数据导入之后, 就该应用到项目中去了. 那在项目中, 该怎么整合和应用solr呢? 接下来, 就来整合和应用solr 一. 整合 1. 引入jar包 <prope ...

  3. 快速搭建一个“微视”类短视频 App

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 " ...

  4. 简易的命令行聊天室程序(Winsock,服务器&客户端)

    代码中使用WinSock2函数库,设计并实现了简单的聊天室功能.该程序为命令行程序.对于服务器和客户端,需要: 服务器:创建监听套接字,并按本地主机绑定:主线程监听并接受来自客户端的请求,并为该客户端 ...

  5. (转)Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置MapperFactoryBea ...

  6. Spring中通配符问题

    一.加载路径中的通配符 (1)?(匹配单个字符) (2)*(匹配除/外任意字符) (3)**/(匹配任意多个目录) 示例: (1)classpath:app-Beans.xml 说明:无通配符,必须完 ...

  7. Word Reversal (简单字符串处理)

    题目描述: For each list of words, output a line with each word reversed without changing the order of th ...

  8. Apriori算法进行关联分析

    设全集U = {a, b, c, d, e},其元素a,b, c, d, e称为项. 数据集: D = [ {a, b}, {b, c, d}, {d, e}, {b, c, e}, {a,b, c, ...

  9. 并发编程之 线程协作工具 LockSupport

    前言 在前面的文章中,我们介绍了并发工具中的4个,Samephore,CyclicBarrier,CountDownLatch,Exchanger,但是我们漏了一个,非常的好用的工具,楼主在这里必须加 ...

  10. iphone safari浏览器CSS兼容性的解决方案集合

    1.iphone safari不兼容CSS的active的解决方案如下: <body ontouchstart="" onmouseover=""> ...