设计模式笔记——门面模式

门面设计模式

基本介绍

门面设计模式是一种结构型模式,通俗的来说(个人观点):门面(Facade)指的是建筑物的表面,尤其指的是最有吸引力的那一面,可以表示一种容易让人误解某人的真实感受或情况的行为和面貌,当人们从建筑物的表面路过时,会被眼前美丽的表面所吸引,却不了解内部的结构的复杂性,这就是门面模式,在隐藏内部复杂性的同时,为客户端提供一个接口,使其能轻松的访问系统,进行相应的处理

就好比去超市买东西,**琳琅满目的商品(复杂的系统)在一个偌大的空间中摆放着,而我们(客户端)需要来这个超市买我们所需要的东西,实现我们的想法,但是在偌大的超市中找到自己需要的商品(客户端自己去构建系统),因为对这些构架不太了解,会是一个十分困难的过程,此时我们回去找超市的导购员(门面)**去询问,对整个超市商品分布的十分熟悉的导购员会很快的给出这个商品的具体位置(帮助构件系统),这样就能节省很多的时间,而且也需要去为了买到一个商品而去了解整个超市的商品分布,这就是门面模式的一个实例

  • 对于门面模式,他其实完成了下面的事

    • 它为子系统的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统
    • 它解决的问题:如何用单个接口对象来表示复杂的子系统,实际上他是对底层子系统的组合
    • 促进了实现与多个客户端的解耦

UML图

在这个模式中有三个主要参与者

  • 门面:负责将一个复杂的系统封装起来,而为外部提供一个舒适的接口
  • 系统:一组不同的子系统,整个系统混合在一起,难以观察使用
  • 客户端与门面交互,从而轻松的实现与门面的交互,不必担心系统的复杂性
  1. 门面

一个接口,它直到来自客户端的某个请求由哪个子系统处理,将客户端的请求委派给相应的子系统实现

  1. 系统

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

  1. 客户端

实例化门面的类,向门面发出相应的请求,从而间接调用子系统完成相应的工作

实例

比如你是一个男生,在你的一生中遇到了自己想保护一辈子的姑娘,经过几年时间的相处,你发现这辈子非她不娶,于是你求婚了,双方父母欣然同意,你的姑娘也十分期待,临近婚礼,你想给她一个浪漫的、隆重的婚礼,于是你开始了筹备,婚礼酒店、音乐、食品、司仪、场景布置等等事情让你忙的手忙脚乱,在这个过程中,因为你对这方面了解不是很多,你只是一个不懂浪漫的死直男,但是你非常想把这件事情筹备好,俗话说,专业的事得交给专业的人去做,于是,在朋友的推荐下,你找到了一家专业的婚礼筹划公司,让他们帮你解决这些棘手的问题,并且为你争取一个最优惠的价格,在专业团队的张罗下,一个十分浪漫的婚礼呈现了出来,你的老婆十分开心,你的丈母娘直呼这小子不错,还有你的父母欣慰的想着这孩子长大了,事情非常的圆满,但是换做你来筹备的话,可能不是十分的理想,因为你去构建这些系统和准备的时候由于缺乏相应的专业知识,可能会造成事倍功半的效果,但是你做了一个明确的选择,将事情交给专业的人去做,prefect!

下面从门面模式的角度出发理解:

客户端:你对婚礼的需求,你负责指点江山

门面:你交付置办婚礼的专业团队,他们负责具体事项的落实,交涉

子系统:餐饮、音乐、司仪、场地等服务

Python实现

# -*- coding=utf-8 -*-class EventManager(object):"""婚礼筹划公司:通过arrange方法来筹划婚礼的具体细节(即构建子系统)"""def __init__(self):print("Wedding Company:: Let me prepare this wedding~\n")def arrange(self):self.hotelier = Hotelier()self.hotelier.bookHotel()self.florist = Florist()self.florist.setFlowerRequirments()self.caterer = Caterer()self.caterer.setCuisine()self.musician = Musician()self.musician.setMusicType()def __del__(self):print("Wedding Company: All things are ready!")class Hotelier(object):"""酒店子系统__isAvailable: 给出酒店场地是否空闲bookHotel: 预定酒店场地"""def __init__(self):print("Arranging the Hotel for Marriage? --")def __isAvailable(self) -> bool:print("Is the Hotel free for the event on given day?")return Truedef bookHotel(self):if self.__isAvailable():print("Registered the Booking\n\n")class Florist(object):"""花店子系统setFlowerRequirments: 负责婚礼花的装饰,准备"""def __init__(self):print("Flower Decorations for the Event? --")def setFlowerRequirments(self):print("Carnations, Roses and Lilies would be used for Decorations\n\n")class Caterer(object):"""餐饮子系统setCuisine: 负责婚礼现场餐饮的准备"""def __init__(self):print("Food Arrangements for the Event --")def setCuisine(self):print("Chinese & Continental Cusisine to be served\n\n")class Musician(object):"""音乐子系统setMusicType: 负责婚礼现场的BGM准备"""def __init__(self):print("Musical Arrangements for the Marriage --")def setMusicType(self):print("Jazz and Classical will be played\n\n")class You(object):"""客户端: 你askEventManager: 你给婚礼公司提需求,婚礼公司收到后就去筹备了,你就负责在旁边统筹规划以下,喝喝茶啥的,最后招待招待"""def __init__(self):print("You:: Whoa! Marriage Arrangements??!!!")def askEventManager(self):print("You:: Let's Contact the Event Manager\n\n")em = EventManager()em.arrange()def __del__(self):print("You:: Thanks to you! Let we began! Phew!")if __name__ == "__main__":you = You()you.askEventManager()del youprint("\nAn romantic wedding is begin...")print("The bridegroom and the bride of the wedding find the best partner of the world")print("Then there have an baby...")print("Story is not end...")
You:: Whoa! Marriage Arrangements??!!!
You:: Let's Contact the Event ManagerWedding Company:: Let me prepare this wedding~Arranging the Hotel for Marriage? --
Is the Hotel free for the event on given day?
Registered the BookingFlower Decorations for the Event? --
Carnations, Roses and Lilies would be used for DecorationsFood Arrangements for the Event --
Chinese & Continental Cusisine to be servedMusical Arrangements for the Marriage --
Jazz and Classical will be playedWedding Company: All things are ready!
You:: Thanks to you! Let we began! Phew!An romantic wedding is begin...
The bridegroom and the bride of the wedding find the best partner of the world
Then there have an baby...
Story is not end...

C++实现

#include<iostream>using namespace std;class Hotelier{public:Hotelier(){cout<<"Arranging the Hotel for Marriage? --"<<endl;}private:bool isAvailable(){cout<<"Is the Hotel free for the event on given day?"<<endl;return true;}public:void bookHotel(){if(isAvailable())cout<<"Registered the Booking\n\n"<<endl;}
};class Florist{public:Florist(){cout<<"Flower Decorations for the Event? --"<<endl;}public:void setFlowerRequirments(){cout<<"Carnations, Roses and Lilies would be used for Decorations\n\n"<<endl;}
};class Caterer{public:Caterer(){cout<<"Food Arrangements for the Event --"<<endl;}public:void setCuisine(){cout<<"Chinese & Continental Cusisine to be served\n\n"<<endl;}
};class Musician{public:Musician(){cout<<"Musical Arrangements for the Marriage --"<<endl;}public:void setMusicType(){cout<<"Jazz and Classical will be played\n\n"<<endl;}};class EventManager{public:EventManager(){cout<<"Wedding Company: Let me prepare this wedding~"<<endl;}~EventManager(){cout<<"Wedding Company: All things are ready!"<<endl;}public:void arrange(){Hotelier hotelier;hotelier.bookHotel();Florist florist;florist.setFlowerRequirments();Caterer caterer;caterer.setCuisine();Musician musician;musician.setMusicType();}
};class You{public:You(){cout<<"You: Whoa! Marriage Arrangements?!!!"<<endl;}public:void askEventManager(){cout<<"You: Let's me Contact the Event Manager\n\n"<<endl;{EventManager em;em.arrange();}cout<<"You: Thanks to you! Let we began! Phew!"<<endl;}
};int main(int argc, char *argv[]){You you;you.askEventManager();cout<<"\nAn romantic wedding is begin..."<<endl;cout<<"The bridegroom and the bride of the wedding find the best partner of the world"<<endl;cout<<"Then there have a baby..."<<endl;cout<<"Story is not end..."<<endl;
}
You: Whoa! Marriage Arrangements?!!!
You: Let's me Contact the Event ManagerWedding Company: Let me prepare this wedding~
Arranging the Hotel for Marriage? --
Is the Hotel free for the event on given day?
Registered the BookingFlower Decorations for the Event? --
Carnations, Roses and Lilies would be used for DecorationsFood Arrangements for the Event --
Chinese & Continental Cusisine to be servedMusical Arrangements for the Marriage --
Jazz and Classical will be playedWedding Company: All things are ready!
You: Thanks to you! Let we began! Phew!An romantic wedding is begin...
The bridegroom and the bride of the wedding find the best partner of the world
Then there have a baby...
Story is not end...

最少知识原则

门面为我们提供了一个统一的系统,使得子系统更加易于使用,将客户端与子系统解耦,其设计原理就是最小知识原则

  • 在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以交互的方式
  • 遵循这个原则,就能够避免创建许多彼此紧密耦合的类的情况
  • 如果类之间存在大量的依赖关系,那么系统就会变得难以维护,如果对系统中任何一部分进行修改,都可能导致系统的其他部分被无意改变,这意味着系统会退化,是应该坚决避免的

用门面模式讲一个浪漫的爱情故事,实现一场美好的婚礼相关推荐

  1. python 贴吧盖楼_「今天,只想讲一个跨年爱情故事。

    原标题:「今天,只想讲一个跨年爱情故事. Hula CLUB 年末一到 整颗心都会变得柔软起来 冷冽的风和冰凉的空气 仿佛都是为了衬托 一杯热饮,一只被窝和一整年的故事 带来的温暖与爱 ✨ 今天小呼啦 ...

  2. 《520七夕情人节表白礼物》:虚幻浪漫的爱情故事——❤520表白星空漫漫3D相册❤(HTML+CSS+JavaScript)...

    <520七夕情人节表白礼物>:虚幻浪漫的爱情故事--❤520星空漫漫3D相册❤(HTML+CSS+JavaScript) 520七夕节告白,也就是中国的情人节,你除了送花你还会什么?? 快 ...

  3. 用ChatGPT讲一个关于猴子的故事

    今天让ChatGPT编了一个小猴子的故事,效果还不错. 首先设置目标: Goal 1: 讲一个关于猴子的故事 Goal 2: 童话故事 Goal 3: 寓言 Goal 4: 讲给小朋友听的 Goal ...

  4. 笛卡尔心形线——一个凄美的爱情故事(附MATLAB三维心形线和HTML二维心形线代码)

    1650年,斯德哥尔摩的街头,52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀. 那时,落魄.一文不名的笛卡尔过着乞讨的生活,全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍.生性清高的笛卡尔 ...

  5. 转一个无聊的爱情故事:如果有个女生为你哭

         这是很早以前看到的一篇文章,偶尔看到,突然很多往事一下子全涌了出来,原来我曾以为忘却了的,却深藏在心中,永远无法抹去. 假如你的生命里有这样一个女孩,她既不漂亮,也不温柔,但她很可爱,和她在 ...

  6. 一个撕心裂肺的爱情故事

    在经过一段刻苦铭心撕心裂肺的恋爱后,我对爱情失去了感觉.看到周围的朋友同事纷纷筑起小巢,我也想有个家.于是在同事的介绍下我与欣认识了. 欣,在一家国营企业当技术员.长得一般,身材娇小,脸色也不太好,看 ...

  7. 佳都科技要讲一个“AI+交通”的故事,资本市场愿意买单么?

    数据智能产业创新服务媒体 --聚焦数智 · 改变商业 在提供人工智能服务的企业当中,佳都科技算是上市较早的,其1999年就在上海证券交易所A股主板上市(股票代码:600728).佳都科技创立于1992 ...

  8. 讲一个我个人的故事!如何活到今天

    注:本文首发是在『Creator星球游戏开发社区』2020年3月24日 "一个游戏多份收益,助力开发者技术精进,副业挣钱" 晓衡经过了两年多的全职亲身实践与探索,在2020年3月开 ...

  9. 一个感人的爱情故事(中英对照)

    a girl and a boy were on a motorcycle, speeding through the night.  一天夜里,男孩骑摩托车带着女孩超速行驶 they loved e ...

最新文章

  1. 外贸常用术语_外贸英文用语,为邮件增光添彩
  2. 我国医疗机器人产业发展特征分析
  3. 最优化——线性规划中最大规划和最小规划之间的转换
  4. java中如何将string 转化成long(亲测)
  5. Android 显示全文折叠控件
  6. 关于 mysql 在联合查询时,使用 concat 拼接查询条件
  7. opengl glad.h和 glu.h
  8. BeetleX实现MessagePack和Protobuf消息控制器调用websocket服务详解
  9. shiro学习(21):动态添加验证规则1
  10. mqtt协议详解_IoT物联网设备上云技术方案详解
  11. 正式环境docker部署hyperf_使用docker搭建hyperf环境连接mysql
  12. python计算在月球的体重_NumPy-快速处理数据--矩阵运算
  13. sap生产工单报工_SAP作业分割与作业价格计算说明
  14. 【登录界面】vue、element-ui登录界面模板
  15. python计算手机销量年增长率_「净资产增长率」Python量化数据获取:总资产同比增长率与净资产同比增长率 - seo实验室...
  16. C语言入门递归算法——汉诺塔(简单易懂,最后还有汉诺塔游戏)
  17. 深度学习模型与湿实验的结合,有望用于代谢通量分析
  18. 人口logistic模型公式_最新人口指数增长模型和logistic模型教学文案
  19. python练习-Python输出不重复的字符
  20. Adversarial Semantic Alignment for Improved Image Captions

热门文章

  1. java 调用graphviz_java程序如何调用Graphviz
  2. git 拉取远程分支到本地(两种方法)
  3. 《Essential Linux Device Drivers》第2章
  4. docker 部署 apollo
  5. Linux系统配置(防火墙)
  6. CentOS 7关闭防火墙命令
  7. 解密:2012世界末日其实是个大骗局
  8. 犹太人常说的理财故事
  9. forEach、map、for..of、for..in、for循环实现异步变同步的问题
  10. Modelsim学习笔记