结构型模式之门面模式

举报
子都爱学习 发表于 2022/02/27 11:32:05 2022/02/27
【摘要】 门面模式为一个子系统中的一系列接口提供一个统一的接口。门面模式定义了一个更高层次的接口,而令该子系统使用起来更加容易。意图为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更简单的方式使用子系统门面模式解决的问题是,如何用单个接口对象来表示复杂的子系统。事实上,它并不是封装子系统,而是对底层子系统进行组合它促进了实现与多个客户端的解耦                 ...

门面模式

为一个子系统中的一系列接口提供一个统一的接口。门面模式定义了一个更高层次的接口,而令该子系统使用起来更加容易。

意图

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

                           

优点

1、减少了系统之间的相互依赖,提高了系统的灵活;
2、提高了整体系统的安全性:封装起的系统对外的接口才可以用,隐藏了很多内部接口细节,若方法不允许使用,则在门面中可以进行灵活控制。


实现

1.客户端

实例化门面,会向门面提出请求,去让子系统完成相应的功能,客户端与门面进行交互,而不直接与子系统交互,这样就可以轻松地与子系统进行通信并完成工作事项,而不必担心系统的复杂性。

class You:
    def __init__(self):
        print("You:: Whoa! Marriage Arrangements??!!!")

    def asskEventManager(self):
        print("You:: Let's Contact the Event Manager\n\n")
        em = EventManager()
        em.arrange()

    def __del__(self):
        print("You:: Thanks to Event Manager, all preparations done!")

2.门面

将一组复杂的接口封装起来提供一个统一的接口,知道某个请求应该交由哪个子系统处理,通过组合的方式将客户端的请求委派给相应的子系统对象

class EventManager:
    def __init__(self):
        print("Event Manager:: Let me talk to the folks\n")

    def arrange(self):
        self.hotelier = Hotelier()
        self.hotelier.bookHotel()

        self.florist = Florist()
        self.florist.setFlowerRequirements()

        self.caterer = Caterer()
        self.caterer.setCuisine()

        self.musician = Musician()
        self.musician.setMusicType()

3.系统

实现子系统的功能,由一组负责不同任务的类来表示,处理门面对象分配的工作,但并不知道门面也不引用它

class Hotelier:
    def __init__(self):
        print("Arranging the Hotel for Marriage? --")

    def __isAvailable(self):
        print("Is the Hotel free for the event on given day?")
        return True

    def bookHotel(self):
        if self.__isAvailable():
            print("Registered the Booking\n\n")


class Florist:
    def __init__(self):
        print("Flower Decorations for the Event? --")

    def setFlowerRequirements(self):
        print("Carnations, Roses and Lilies would be used for Decorations\n\n")


class Caterer:
    def __init__(self):
        print("Food Arrangements for the Event --")

    def setCuisine(self):
        print("Chinese & Continental Cuisine to be served\n\n")


class Musician:
    def __init__(self):
        print("Musical Arrangements for the Marriage --")

    def setMusicType(self):
        print("Jazz and Classical will be played\n\n")

3.执行

你在家中举行一场婚礼,你是客户端,你把所有的事情都交给了会务经理(门面),你交代完之后找个地方喝茶去了。会务经理则把事务交给各个子系统完成。

you = You()
you.asskEventManager()

最少知识原则

门面能够将客户端与实现具体功能的子系统解耦,其背后的设计原理即最少知识原则。

  • 在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以及交互的方式
  • 避免创建许多彼此紧密耦合的类。若类之间存在大量的依赖关系,系统就会变得难以维护,应坚决避免

缺点

1、门面模式的缺点在于,不符合开闭原则,一旦系统成形后需要修改,几乎只能重写门面代码,这比继承或者覆写等方式,或者其它一些符合开闭原则的模式风险都会大一些。

应用

1、为一个复杂的子系统提供一个外界访问的接口。这类例子是生活还是蛮常见的,例如电视遥控器的抽象模型,电信运营商的用户交互设备等;
2、需要简化操作界面时。例如常见的扁平化系统操作界面等,在生活中和工业中都很常见。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。