一、外观模式

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(结构型)。

外观模式的角色:

  • 抽象外观角色:在客户端可以调用它的方法;
  • 具体外观角色:实现抽象外观里面的抽象方法;
  • 子系统角色:一个软件系统里有多个子系统角色,每个子系统不仅可以是一个类,还可以是类的集合,每个子系统都不允许被客户端调用。

二、实现

在src目录下,新建一个facade文件夹,在该文件夹下新建一个facade.cj文件和facade.drawio文件。

类图

核心代码

package DesignPattern.facade

// 抽象外观类
public abstract class AbstractEncrypt {
    public func fileEncrypt(fileSrc: String, fileDesc: String): Unit
}

// 外观类
public class Encrypt <: AbstractEncrypt {
    private let fileReader: FileReader
    private let cipherMachine: CipherMachine
    private let fileWriter: FileWriter

    public init() {
        this.fileReader = FileReader()
        this.cipherMachine = CipherMachine()
        this.fileWriter = FileWriter()
    }

    public override func fileEncrypt(fileSrc: String, fileDesc: String) {
        let read = this.fileReader.read(fileSrc)
        let encrypt = this.cipherMachine.encrypt(read)
        this.fileWriter.writer(encrypt, fileDesc)
    }
}

// 子系统
private class FileReader {
    public func read(fileSrc: String): String {
        println("从${fileSrc}明文读取文件...")
        return "123456"
    }
}

private class CipherMachine {
    public func encrypt(data: String): String {
        println("明文数据: ${data}")
        println("数据加密中...")
        println("加密完成")
        return "******"
    }
}

private class FileWriter {
    public func writer(data: String, fileDesc: String) {
        println("加密数据${data}保存文件到${fileDesc}")
    }
}

测试代码

package DesignPattern
import DesignPattern.facade.*

main(): Int64 {
    let encrypt = Encrypt()
    encrypt.fileEncrypt("./src/demo.txt", "./src/demo_encrypt.txt")

    return 0
}

三、优缺点

优点:

  • 对客户端隐藏了子系统,使得客户端的代码变得简单;
  • 实现子系统与客户端之间的解耦,使得子系统的变化不会影响到调用它的客户端;
  • 一个子系统的修改,不会影响其他子系统。

缺点:

  • 不能很好的限制客户使用子系统类,如果客户端访问子系统类做了太多限制,会灵活性和可变性;
  • 如果设计不得当,可能会修改外观类的代码,违背开闭原则。

四、适用环境

  • 当要为访问一系列复杂的子系统提供一个简单的入口时,可以使用外观模式;
  • 客户端与多个子系统存在很大依赖时,可以用外观模式进行解耦。

五、小结

本章为大家详细的介绍了仓颉设计模式中外观模式的内容,下一章,为大家带来外观模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐