理解设计模式(十一)——门面模式(外观模式)

Facade Pattern(门面模式)

提出问题

有时候,我们在多个地方都要用到相同的若干个模块,导致依赖关系十分复杂,代码冗余程度非常高。比如说,在系统的多个地方我们都要对文件进行加密。对文件进行加密的过程中,我们需要读取文件,写入文件,还需要加密模块。那么,我们就会在程序的多个地方重复调用这几个模块对应的函数。如果后期需要对其进行修改,比如修改加密的方式,可能需要在整个系统中到处寻找调用了加密模块的地方。修改起来很不方便。因此,需要找一个方法解决依赖过于分散的问题。

解决问题

之前提到的问题的核心其实是三个模块过于分散,不符合高内聚的设计要求。如果我们把三个模块组合到一起,形成一个统一的模块,然后再在程序各个地方调用这个模块,我们就提高了代码的内聚程度。如果要修改,只需要修改新组成的模块即可。

下面使用代码来演示:

class FileReader {
Read() {
// ...
}
}

class FileWriter {
Write(something, dest) {
// ...
}
}

class FileEncrypt {
Encrypt(something) {
// ...
}
}

class EncryptFacade {
constructor() {
this.reader = new FileReader();
this.writer = new FileWriter();
this.encrypter = new FileEncrypt();
}
FileEncrypt(fileSource, fileDest) {
let plain = this.reader.Read(fileSource);
let encrypt = this.encrypter.Encrypt(plain);
this.writer.Write(encrypt, fileDest);
}
}

let encryptFacade = new EncryptFacade();
encryptFacade.FileEncrypt("src", "dst");
Author: LeoB_O
Link: https://leob-o.github.io/2019/06/08/FacadePattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.