`

《设计模式》之十六:门面模式

阅读更多

Facade Pattern 门面模式是一种比较常用的封装模式,其定义如下:

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,门面模式提供一个高层次的接口,使得子系统更易于使用。

 

门面模式的角色定义:

1,Facade门面角色

客户端可以调用就只有这个角色的方法,此角色知晓子系统所有功能和责任。

2,Subsystem子系统角色

可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另一个客户端而言。

 

通用源码,实在太简单,我都不想写了:

public class ClassA {
    public void doSomething() {
        System.out.println("ClassA dosomething...");
    }
}

 

public class ClassB {
    public void doSomething() {
        System.out.println("ClassB dosomething...");
    }
}

 

public class Facade {
    // 被委托对象
    private ClassA a = new ClassA();
    private ClassB b = new ClassB();
    // 提供给外部访问的方法:
    public void methodA() {
        this.a.doSomething();
    }
    public void methodB() {
        this.b.doSomething();
    }
}

 

门面模式的优点:

1,减少系统的相互依赖

2,提高了灵活性

3,提高了安全性:想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休息访问到。

 

门面模式的缺点:

不符合开闭原则,对修改关闭,对扩展开放。看看门面Facade对象,一旦系统投产后发现了一个小小bug,你怎么解决,继承和覆写都无法解决,只能去修改Facade角色的代码,这个风险太大了。

 

门面模式使用场景:

1,为一个复杂的模块或子系统提供一个供外界访问的接口

2,子系统相对独立 -- 外界对子系统的访问只要黑箱操作即可

3,预防低水平程序员带来的风险扩散

 

门面模式注意事项:

1,一个子系统可以有多个门面

当门面庞大到不能忍受的程度,比如门面对象超过了200行代码,可以按照功能来拆分

子系统提供不同的路径访问,比如一个门面可以访问所有子系统功能,另一个只能访问受限的几个

2,门面千万不要参与子系统内的业务逻辑

必须确保即使门面不存在,也能靠子系统实现所有功能,也就是说门面对象不能有自己的业务逻辑方法,只能由子系统调用链。

 

最佳实践:

门面模式是一个很好的封装方法,一个子系统比较复杂时,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来。技术水平比较差的成员,尽量安排独立模块,然后把他写的程序封装到一个门面中去,尽量让别人不用看到这些人的代码,然后对门面的方法进行大量的单元测试,约束代码质量。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式之门面模式

    门面模式(Facade Pattern)是软件工程中一种常用的设计模式,属于结构型模式。它提供了一个统一的接口,用来访问子系统中的一群接口。门面模式使得子系统的使用更为简单,同时也隐藏了子系统的复杂性,使得客户端...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    Android也架构之四:门面模式解析获取的html代码

    门面模式(Facade Pattern)是一种设计模式,属于结构型模式,它为子系统提供了一个统一的接口,使得客户端可以更方便地使用子系统的功能,而无需了解子系统内部的复杂性。在Android开发中,门面模式同样发挥着重要...

    23种设计模式--门面模式

    在提供的资源“第17课_设计模式之门面模式.avi”中,可能包含了对门面模式的详细讲解和实例演示,可以帮助你更深入地理解和掌握这一设计模式。通过观看视频,你将有机会看到如何在实际代码中应用门面模式,以及如何...

    23种设计模式文档

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题,提供了一套可复用的解决方案。这些模式都是经过无数项目经验积累而来的,可以帮助开发者更高效地设计和实现高质量的软件系统。本资源包含...

    23种设计模式的实现(Java 版),java设计模式

    5. **门面(外观)模式**:结构型设计模式,提供了一个统一的接口,用来访问子系统中的一组接口。它简化了子系统的使用,隐藏了子系统的复杂性,只对外暴露简单的接口。 6. **代理模式**:代理模式为其他对象提供一...

    java中常用设计模式总结心得

    4. **门面模式**:门面模式是一种结构型设计模式,为子系统提供了一个统一的入口,降低了客户端与子系统之间的耦合。它简化了子系统的接口,客户端只需要知道门面类,而无需关心子系统内部的具体实现。 5. **装饰器...

    JavaScript设计模式.pdf

    单体模式是JavaScript中最基本的设计模式之一。它的主要作用是提供一个命名空间,减少全局变量的数量,避免代码冲突,并组织代码使其易于维护。单体模式可以用来划分命名空间,组织代码和避免代码冲突。 2. 工厂...

    java26个设计模式

    但工厂模式、单例模式、观察者模式、门面模式、适配器模式等因为其广泛适用性,通常被认为是在找工作时需要掌握的基础设计模式。了解并熟练应用这些设计模式,可以提高代码质量,使系统更加灵活和易于维护。

    设计模式 之 “门面模式[Facade Pattern]”

    门面模式(Facade Pattern)是软件工程中一种常用的结构型设计模式,它的主要目的是提供一个统一的接口,用来简化系统中一组复杂的接口或类的使用。这个模式将复杂的子系统接口封装在一个简单的门面对象中,使得...

    python设计模式第2版.pdf

    设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计已经逐渐成为软件开发和维护过程中的一个重要课题。 Python设计模式(第2版)通过11章内容,全面揭示有关设计模式的内容,并结合Python语言进行示例...

    php设计模式

    例如,Laravel框架就大量运用了设计模式来实现其功能,比如使用服务容器来实现依赖注入模式,使用门面模式来简化复杂的服务类访问等。 11. 如何在PHP中学习和实践设计模式:可以通过阅读设计模式相关书籍、在线教程...

    设计模式_源代码 24种设计模式源码

    1. **工厂模式**:这是最简单和最常用的设计模式之一,它提供了一种创建对象的最佳方式。在工厂模式中,一个工厂类负责创建对象,而客户端无需知道具体创建过程,只需知道如何使用对象即可。 2. **抽象工厂模式**:...

    设计模式实战:使用JAVA开发的飞机大战小游戏,包含了23种设计模式,.zip

    项目中包含的23种设计模式可能包括单例模式、工厂模式、观察者模式、策略模式、装饰器模式、适配器模式、代理模式、建造者模式、状态模式、命令模式、模板方法模式、访问者模式、桥接模式、组合模式、享元模式、迭代...

    几种常用的设计模式介绍

    他在《建筑的永恒之道》中阐述了设计模式的概念,认为它们是解决常见问题的标准方案。这些模式后来被引入到软件工程领域,特别是在1990年代由Erich Gamma等人推广,形成了23种经典的设计模式。 设计模式主要分为三...

    设计模式入门之一:深入单例模式

    单例模式是设计模式中最基础且常用的一种,它旨在确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,有些对象只需要一个实例就能满足需求,比如线程池、数据库连接、配置管理等。使用单例模式可以避免...

    设计模式精解(C++版)

    《设计模式精解(C++版)》是深入理解并应用设计模式的重要参考资料,它涵盖了GoF提出的23种经典设计模式。设计模式是软件工程中经过实践验证的、解决常见设计问题的有效方法,是软件开发人员之间的通用语言,极大地...

Global site tag (gtag.js) - Google Analytics