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

来源:互联网 发布:电动汽车推荐 知乎 编辑:程序博客网 时间:2024/05/16 10:13

Facade Pattern

1. 什么是外观模式

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式又称为门面模式,它是一种对象结构型模式。
外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。

它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。外观模式并不给系统增加任何新功能,它仅仅是简化调用接口

2. 外观模式类角色解析

外观模式结构图:
外观模式

  • Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
  • SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能。
    每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

在实际操作中,可以使用抽象外观类来一定程度上符合开闭原则。

3. 代码示例

一个文件加密模块,该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中,具体的流程包括三个部分,分别是读取源文件、加密、保存加密之后的文件,其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。

这三个操作相对独立,为了实现代码的独立重用,让设计更符合单一职责原则,这三个操作的业务代码封装在三个不同的类中。

//文件读取模块public class FileReader {    public String readFile(String path) {        System.out.println("读取文件: " + path);        return "读取文件:" + path;    }}//文件加密模块public class Encryption {    public String encrypt(String s) {        System.out.println("加密:" + s);        return "加密后的: " + s;    }}//保存文件模块public class FileWriter {    public void write(String s, String path) {        System.out.println("写出到文件 " + path + ", 内容为: " + s);    }}//门面,封装三个类,对外暴露统一接口,方便用户调用public class FacadeEncryption {    private FileReader fileReader;    private Encryption encryption;    private FileWriter fileWriter;    public FacadeEncryption() {        this.fileReader = new FileReader();        this.encryption = new Encryption();        this.fileWriter = new FileWriter();    }    public void encrypt(String sourceFilePath, String desFilePath) {        String s = fileReader.readFile(sourceFilePath);        String encrypt = encryption.encrypt(s);        fileWriter.write(encrypt,desFilePath);    }}//测试类public class MainClass {    public static void main(String[] args) {        //单独调用        //String s = new FileReader().readFile("一个路径");        //String encrypt = new Encryption().encrypt(s);        //new FileWriter().write(encrypt, "新的路径");        new FacadeEncryption().encrypt("一个路径", "新的路径");    }}
0 0