GoF 结构型 外观模式

外观模式的定义

为子系统中的一组接口提供一致的界面,Facade模式定义了一个高级接口,使子系统更加易用。
界面:从外部看这个类,这个类的public方法就是这个类的界面。
接口:不等价于interface,而是内部与外部交互的通道,可以是类方法也可以是接口的方法。
外观模式体现了最少知识原则。

外观模式的本质

封装交互,简化调用。

外观模式的目的

减少外部与内部多个模块的交互,松散耦合,使用更简单。
外观模式包装已有功能,不建议添加新功能。
外观模式提供了缺省的实现,有外观模式也可以不用,仍然可以自己组合。

外观模式的优缺点

松散耦合。松散了子系统与客户端的耦合关系,让子模块更容易扩展。
简单易用。客户端不再需要深入了解子系统内部的实现,也不需要与多个模块进行交互,外观提供了一站式服务。
更好的划分访问层次。有些方法是提供给内部的,有些是提供给外部的。把暴露给外部的功能集中到外观中,既方便外部使用,也隐藏了内部实现。
缺点:过多的不合理的Facade也容易让人迷惑,该用Facade还是直接调用模块。

外观模式使用场景

为一个复杂的系统提供一个简单的接口的时候。
构建多层结构的系统的时候。每层通过外观对象作为入口,既可以简化层间调用又可以松散耦合。

示例1

public interface ApiModuleA {
    void moduleA();
}
public class ApiModuleAImpl implements ApiModuleA {
    @Override
    public void moduleA() {
        System.out.println("模块A的方法实现");
    }
}
public interface ApiModuleB {
    void moduleB();
}
public class ApiModuleBImpl implements ApiModuleB {
    @Override
    public void moduleB() {
        System.out.println("模块B的方法实现");
    }
}
public interface ApiModuleC {
    void moduleC();
}
public class ApiModuleCImpl implements ApiModuleC {
    @Override
    public void moduleC() {
        System.out.println("模块C的方法实现");
    }
}
public class Facade {

    public void modules() {
        ApiModuleA a = new ApiModuleAImpl();
        ApiModuleB b = new ApiModuleBImpl();
        ApiModuleC c = new ApiModuleCImpl();
        a.moduleA();
        b.moduleB();
        c.moduleC();
    }

}
public class TestClient {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.modules();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。