09.外观模式

定义

  • 为子系统中的一组接口提供一个一致的界面称为外观模式,外观模式定义了一个高层接口,这个接口使得这一子系统更容易使用。
  • 核心思想:用一个简单的接口来封装一个复杂的系统,使这个系统更容易使用。

也叫门面模式

外观模式的模型抽象

类图

Facade 封装了子系统的复杂实现,给外部提供一个统一的接口,用户只需要通过 Facade 来访问子系统,而不用关心内部 ClassA、ClassB、ClassC、ClassD 的具体实现。

模型说明

  • 设计要点
    • 外观模式是最简单的设计模式之一,只有以下两个角色。
      • 外观角色(Façade):为子系统封装统一的对外接口,如同子系统的门面。这个类一般不负责具体的业务逻辑,只是一个委托类,具体的业务逻辑由子系统完成。
      • 子系统(SubSystem):由多个类组成的具有某一特定功能的子系统。可以是第三方库,也可以是自己的基础库,还可以是一个子服务,为整个系统提供特定的功能或服务。
  • 优缺点
    • 优点:
      • 实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响调用它的客户端。
      • 简化了客户端对子系统的使用难度,客户端(用户)无须关心子系统的具体实现方式,而只需要和外观进行交互即可。
      • 为不同的用户提供了统一的调用接口,方便了系统的管理和维护。
    • 缺点:
      • 因为统一了调用的接口,降低了系统功能的灵活性。

例子

#==============================  
from os import path  
# 引入path,进行路径相关的处理  
import logging  
# 引入logging,进行错误时的日志记录  
  
class ZIPModel:  
    """ZIP模块,负责ZIP文件的压缩与解压  
    这里只进行简单模拟,不进行具体的解压缩逻辑"""  
    def compress(self, srcFilePath, dstFilePath):  
        print("ZIP模块正在进行“%s”文件的压缩......" % srcFilePath)  
        print("文件压缩成功,已保存至“%s”" % dstFilePath)  
  
    def decompress(self, srcFilePath, dstFilePath):  
        print("ZIP模块正在进行“%s”文件的解压......" % srcFilePath)  
        print("文件解压成功,已保存至“%s”" % dstFilePath)  
  
  
class RARModel:  
    """RAR模块,负责RAR文件的压缩与解压  
    这里只进行简单模拟,不进行具体的解压缩逻辑"""  
    def compress(self, srcFilePath, dstFilePath):  
        print("RAR模块正在进行“%s”文件的压缩......" % srcFilePath)  
        print("文件压缩成功,已保存至“%s”" % dstFilePath)  
  
    def decompress(self, srcFilePath, dstFilePath):  
        print("RAR模块正在进行“%s”文件的解压......" % srcFilePath)  
        print("文件解压成功,已保存至“%s”" % dstFilePath)  
  
  
class ZModel:  
    """7Z模块,负责7Z文件的压缩与解压  
    这里只进行简单模拟,不进行具体的解压缩逻辑"""  
    def compress(self, srcFilePath, dstFilePath):  
        print("7Z模块正在进行“%s”文件的压缩......" % srcFilePath)  
        print("文件压缩成功,已保存至“%s”" % dstFilePath)  
  
    def decompress(self, srcFilePath, dstFilePath):  
        print("7Z模块正在进行“%s”文件的解压......" % srcFilePath)  
        print("文件解压成功,已保存至“%s”" % dstFilePath)  
  
  
class CompressionFacade:  
    """压缩系统的外观类"""  
  
    def __init__(self):  
        self.__zipModel = ZIPModel()  
        self.__rarModel = RARModel()  
        self.__zModel = ZModel()  
  
    def compress(self, srcFilePath, dstFilePath, type):  
        """根据不同的压缩类型,压缩成不同的格式"""  
        # 获取新的文件名  
        extName = "." + type  
        fullName = dstFilePath + extName  
        if (type.lower() == "zip") :  
            self.__zipModel.compress(srcFilePath, fullName)  
        elif(type.lower() == "rar"):  
            self.__rarModel.compress(srcFilePath, fullName)  
        elif(type.lower() == "7z"):  
            self.__zModel.compress(srcFilePath, fullName)  
        else:  
            logging.error("Not support this format:" + str(type))  
            return False  
        return True  
    def decompress(self, srcFilePath, dstFilePath):  
        """从srcFilePath中获取后缀,根据不同的后缀名(拓展名),进行不同格式的解压"""  
        baseName = path.basename(srcFilePath)  
        extName = baseName.split(".")[1]  
        if (extName.lower() == "zip") :  
            self.__zipModel.decompress(srcFilePath, dstFilePath)  
        elif(extName.lower() == "rar"):  
            self.__rarModel.decompress(srcFilePath, dstFilePath)  
        elif(extName.lower() == "7z"):  
            self.__zModel.decompress(srcFilePath, dstFilePath)  
        else:  
            logging.error("Not support this format:" + str(extName))  
            return False  
        return True  
  
# Test  
#=======================================================================================================================  
def testRegister():  
    volunteer = Volunteer("Frank")  
    volunteer.welcomeFreshmen("Tony")  
  
  
def testCompression():  
    facade = CompressionFacade()  
    facade.compress("E:\标准文件\生活中的外观模式.md",  
                    "E:\压缩文件\生活中的外观模式", "zip")  
    facade.decompress("E:\压缩文件\生活中的外观模式.zip",  
                      "E:\标准文件\生活中的外观模式.md")  
    print()  
  
    facade.compress("E:\标准文件\Python编程——从入门到实践.pdf",  
                    "E:\压缩文件\Python编程——从入门到实践", "rar")  
    facade.decompress("E:\压缩文件\Python编程——从入门到实践.rar",  
                      "E:\标准文件\Python编程——从入门到实践.pdf")  
    print()  
  
    facade.compress("E:\标准文件\谈谈我对项目重构的看法.doc",  
                    "E:\压缩文件\谈谈我对项目重构的看法", "7z")  
    facade.decompress("E:\压缩文件\谈谈我对项目重构的看法.7z",  
                      "E:\标准文件\谈谈我对项目重构的看法.doc")  
    print()  
  
  
  
  
testCompression()

应用场景

  • 要为一个复杂子系统提供一个简单接口时。
  • 客户程序与多个子系统之间存在很大的依赖性时。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇