理解结构设计模式

1、结构型模式描述如何将对象和类组合成更大的结构

2、结构型模式是一种能够简化设计工作的模式,因为它能够找出更简单的方法来认识或表示实体之间的关系。在面向对象世界中,实体指的是对象或类。

3、类模式可以通过继承来描述抽象,从而提供更有用的程序接口,而对象模式则描述了如何将对象联系起来从而组合成更大的对象。结构型模式是类和对象模式的综合体

下面是结构型设计模式的一些例子:

适配器模式:将一个接口转换成客户希望的另外一个接口。它试图根据客户端的需要来匹配不同类的接口。

桥接模式:该模式将对象的接口与其实现进行解耦,使得两者可以独立工作

装饰器模式:该模式允许在运行时或以动态的方式为对象添加职责,我们可以通过接口给对象添加某些属性

理解门面设计模式

门面通常是指建筑物的表面,尤其时最有吸引力的那一面。它也可以表示一种容易让人误解某人的真实感受或情况的行为或面貌。当人们从建筑物的外面经过时,可以欣赏其外部面貌,却不了解建筑物结构的复杂性。这就是门面模式的使用方式。门面在隐藏内部系统复杂性的同时,为客户端提供一个接口,以便它们可以非常轻松访问系统。

门面设计模式实际上完成了下列事项:

1、它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统。

2、门面所解决问题是,如何使用单个接口对象来表示复杂的子系统。实际上,他并不是封装子系统,而是对底层子系统进行组合。

3、他促进了实现与多个客户端的解耦

门面设计模式主要有三个参与者,门面、系统、客户端

门面:门面的主要责任是,将一组复杂导致系统封装起来,从而为外部世界提供一个舒适的外观。

1、它是一个接口,他知道某给请求可以交个那个子系统进行处理

2、它使用组合将客户端的请求委派给相应的子系统对象

系统:这代表一组不同的子系统,是整个系统混杂在一起,难以观察或使用

1、它实现子系统的功能,同时,系统由一个类表示。理想情况下,系统应该由一组负责不同任务的类来表示。

2、它处理门面对象分配的工作,但并不知道门面,而且不吸引它

客户端:客户端与门面进行交互,这样就可以轻松地与系统进行同学并完成工作,不必担心系统的复杂性。

1、客户端是实例化门面的类

2、为了让子系统完成相应的工作,客户端需要向门面提出请求

以生活中的例子实现门面模式

假设你要在家中举办一场婚礼,并且由你来张罗着一切。这是一个艰巨的任务,你必须预订一家酒店或者场地,与餐饮人员交代酒菜、布置场景,并安排音乐。

下面我们从门面模式的角度来看待这些事情。

客户端:你需要在婚礼前及时完成所有的准备工作。每一项安排都应该是顶级的,这样客人才会喜欢这些庆祝活动。

门面:会务经理负责与所有相关人员进行交涉,这些人员负责处理食物、花卉装饰等

系统:它们代表提供餐饮、酒店管理和花卉装饰等服务的系统。

接下来要谈论的是Facade类。如前所述,Facade类简化了客户端的接口。就本例来说,EventManager扮演了门面的角色,并简化了你的工作,Facade与子系统进行交流,并代表你问婚姻完成所有的预定和准备工作。

下面是EventManager类的代码:

class EventManager(object):def __init__(self):self.hotelier = Noneself.florist = Noneself.caterer = Noneself.musician = Noneprint("EventManager:让我和他们谈谈\n")def arrange(self):self.hotelier = Hotelier()self.hotelier.book_hotel()self.florist = Florist()self.florist.set_flower_requirements()self.caterer = Caterer()self.caterer.set_cuisine()self.musician = Musician()self.musician.set_music_type()

下面我们开始深入了解子系统。

我们为这个场景开发了一下类。

①  Hotelier类用于预定酒店。它有一个方法,用于检查当天是否有免费的酒店(__isAvailable)。

②  Florist类负责花卉装饰。这个类提供了set_flower_requirements()方法,用于指定要使用那些种类的花卉来装饰婚礼。

③  Caterer类用于跟备办宴席者打交道,并负责安排餐饮。Caterer提供了一个公开的set_cuisine()方法,用来指定婚宴的菜肴类型。

④Musician类用来安排婚礼的音乐,它使用set_music_type()方法来了解婚礼的音乐要求。

以上四个类的代码如下:

class Hotelier(object):def __init__(self):print("安排婚礼的酒店?")def __isAvailable(self):print("活动当天酒店免费?")return Truedef book_hotel(self):if self.__isAvailable():print("预定酒店\n\n")class Florist(object):def __init__(self):print("婚礼的花卉装饰?")def set_flower_requirements(self):print("康乃馨、玫瑰会被用来装饰\n\n")class Caterer(object):def __init__(self):print("婚礼宴席的安排?")def set_cuisine(self):print("提供中式及欧式的菜肴\n\n")class Musician(object):def __init__(self):print("婚礼的音乐安排?")def set_music_type(self):print("将演奏爵士乐和古典音乐")

但是,你很聪明,所以将这些事情都委托给了会务经理;下面看看You类,在本示例中,创建了一个EventManager类的对象,这样经理就会通过与相关人员进行交涉来筹备婚礼,而你则可以找个地方喝茶去了

class You(object):def __init__(self):print("You:婚礼的安排?")def ask_event_manager(self):print("You: 联系一下活动经理\n\n")em = EventManager()em.arrange()def __del__(self):print("所有的准备工作都已经完成")you = You()
you.ask_event_manager()

最少知识原则

门面模式背后的设计原理就是最少知识原则。

最少知识原则指导我们减少对象之间的交互:

1、在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以及交互的方式;

2、遵循这个原则,就能够避免创建许多彼此紧密耦合的类的情况

3、如果类之间存在大量依赖关系,那么系统就会变得难以维护。如果对系统中的任何一部分进行修改,都可能导致系统的其他部分被无意改变,这意味着系统会退化,是应该坚决避免的。

Python门面设计模式相关推荐

  1. python做平面设计-Python系列干货之——Python与设计模式

    原标题:Python系列干货之--Python与设计模式 一.创建类设计模式 前言: 什么样的程序员是一个好的程序员?学会很多门编程语言,就是一个好的程序员了么?事实上,学会一门编程语言不是一件很难的 ...

  2. Java中的门面设计模式,非常有用!

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...

  3. 为什么 Python 不用设计模式?

    作者 | 刘欣 责编 | 伍杏玲 本文经授权转自码农翻身(ID:coderising) 在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋友圈以后,发现大家都推荐 ...

  4. 门面设计模式(Facade Pattern)

    GOF设计模式 Facade Pattern 门面设计模式 门面模式例子:我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机 ...

  5. 门面设计模式(facade)

    门面设计模式(facade) 这个贼鸡儿简单,快看两眼,这是我介绍的最后两个设计模式了!坚持,成功一定是属于你的! 这个设计模式叫个啥?门面设计模式??这又是什么玩意(消音ing),好了好了我举个例子 ...

  6. 11【门面设计模式】

    文章目录 十一.门面设计模式 11.1 门面设计模式简介 11.1.1 门面设计模式概述 11.1.2 门面设计模式中的角色 11.2 门面设计模式的实现 11.3 门面设计模式的优缺点 十一.门面设 ...

  7. Java中的门面设计模式

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...

  8. 抽丝剥茧——调停者和门面设计模式

    调停者和门面设计模式 今天我们来聊两个设计模式:调停者设计模式和门面设计模式,为什么要将他们放在一起讲解,因为他们两个东东太像了,仅仅是由于作用的地方不同而产生的不同的叫法. 我们用一个对于我们90后 ...

  9. 20201102 门面设计模式

    门面设计模式: response中getWriter方法就是封装了outputStream 三个角色:子系统角色,门面角色,客户端角色.持有对方的实例. 门面设计模式相当于聚合层,就像云鹊的api-w ...

最新文章

  1. 苹果iphone手机上input的button按钮颜色显示有问题,安卓却没问题
  2. iframe 父窗口和子窗口相互的调用方法集锦
  3. 关于重构,看此文就够了
  4. iphone屏幕录制_无需第三方APP,苹果iPhone手机屏幕录制的方法
  5. Lecture 20 Parallel Algorithms I
  6. 新能源补贴退坡 广汽新能源、比亚迪不涨价 蔚来最狠!
  7. basis问题专区(文档)
  8. 如何下载谷歌地图高程数据
  9. Laravel 路由知识回顾记录 转自laravel 学院Laravel5.8
  10. CentOS Linux操作系统
  11. 你怎么看:就算老公一毛钱股份都没拿到,在我心里,他依然是最牛逼的创业者...
  12. Word文档的基本操作
  13. 上半年要完成的博客占坑77
  14. python创建子窗口_PyQt5实现从主窗口打开子窗口的方法
  15. audio autoplay无效的问题
  16. 官网下载Eclipse(包含历史版本及该版本的子版本)
  17. 前端开发中组件化的优点
  18. 深度学习中的图像增强
  19. JDK源码分析 FutureTask源码分析
  20. UML图有哪些类型?

热门文章

  1. android入门及晋级
  2. 设置liunx服务器编码,中文乱码问题
  3. 【洛谷】P3518 [POI2011]SEJ-Strongbox
  4. 简单好用的二级区域选择控件
  5. SpringBoot核心技术
  6. nova3安装android10系统,一招搞定安卓机“久用必卡”顽疾:华为nova3i配备6GB超大运存...
  7. perl unicode
  8. 区块链概念股分析 | 远光软件大涨128%,区块链或成关键因素?
  9. Welcome to Pete Brown's 10rem.net
  10. 手机号码段简介以及最新手机号段归属地数据库(2018年7月1日)