zoukankan      html  css  js  c++  java
  • 设计模式之门面模式

    一、门面模式的理解

    门面模式是一种结构型设计模式,它主要是为了完成:

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

    这个模式有三个参与者:

    • 门面:将一个复杂的系统进行封装,为外部提供一个接口
    • 系统:内部有多个不同的子系统
    • 客户端:与门面直接进行交互,无需担心系统内部的复杂性

    二、门面模式的实现

      现实世界中有很多门面模式,比如,你现在要开一个大型生日party,那么可能需要准备酒店、歌唱团之类的东西,但是你可能嫌麻烦,此时可以找一个专门负责此类事务的机构负责,而你只需要问他是否已经筹备好即可。这可以比如一个门面模式:

    • 客服端:相当于需要在开始生日party前的所有准备工作
    • 门面:相当于处理准备工作的机构
    • 子系统:相当于酒店的餐饮、歌唱团的娱乐这一类的服务

    现在利用python对上述的实例进行模拟,显然有一个门面类EventManager,它简化了你的工作,完成与子系统的交流,如下所示,生日party的门面需要与酒店与歌唱团交流。

    class EventManager:
    
        def __init__(self):
            print("I talk to folks!")
    
        def arrange(self):
    
            self.wineshop=WineShop()
            self.wineshop.bookWineShop()
    
            self.singgroup=SingGroup()
            self.singgroup.setSingType()

    子系统就是酒店系统与歌唱团系统,它们自己将自己的服务准备完成。

    class WineShop:
    
        def __init__(self):
            print("arange of WineShop for birthday!")
    
        def __isAliable(self):
            """
            酒店是否还有可用的房间
            :return: 
            """
            return True
    
        def bookWineShop(self):
            """
            如果有可用房间就进行预定
            :return: 
            """
            if self.__isAliable():
                print("book success!")
    
    class SingGroup:
    
        def __init__(self):
            print("arange of SingGroup for birthday!")
    
        def setSingType(self):
            """
            歌唱团为生日party准备的音乐
            :return: 
            """
            print("Classical will be played")

    而此时你可以很悠闲,当想知道酒店以及歌唱团准备的怎么样,可以直接询问机构,它会告诉你。

    class You:
    
        def __init__(self):
            print("Birthday arrangements? ")
    
        def askEventManager(self):
            print("contact EventManager")
            em=EventManager()
            em.arrange()
    
    
    you=You()
    you.askEventManager()

      这样就完成了一个门面模式,门面模式设计的原理就是只是最少原则,减少对象之间的交互,在设计系统时,应该考虑与之交互类的数量以及交互的方式,这样避免了类与类之间紧密耦合的情况。

  • 相关阅读:
    【网络】默认路由(路由黑洞,路由终结)
    textstroke(文本描边)和textfillcolor(文本填充色)Css3演示
    enter键提交表单
    Web App和Native App 谁将是未来
    模拟input type=file
    margintop 无效,避开麻烦的margin叠加(margin collapsing)
    用jquery写的简单tab效果
    CSS3下的渐变文字效果实现
    jQuery阻止冒泡和HTML默认操作
    设置文本输入框默认值
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11079923.html
Copyright © 2011-2022 走看看