15_门面模式

【门面模式】

也称为 外观模式。

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

门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。(即领导想了解项目完成的情况,只能通过项目经理,无需去询问底层的程序员、美工、产品经理之类的)。

门面模式主要有两部分组成:

* Facade门面角色

客户端可以调用这个角色的方法。此角色知道所有子系统的所有功能和职责。一般情况下,本角色会将所有客户端发来的请求委派到对应的子系统去,也就是说该角色没有实际的业务逻辑,只是一个委托类。

* subSystem子系统角色

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

【门面模式 例子】

package com.Higgin.Facade;

/**
 * 产品经理
 */
class ProductManager{
    //设计产品
    public void designProduct(){
        System.out.println("产品经理:设计产品...");
    }
}
/**
 * 程序员
 */
class Programmer{
    //写程序
    public void writeProgarmm(){
        System.out.println("程序员:写程序...");
    }
}
/**
 * 美工
 */
class ArtDesigner{
    public void designArt(){
        System.out.println("美工:设计网页...");
    }
}
/**
 * 项目经理
 * 管理者 产品经理、程序员、美工
 */
class ProjectManager{
    private ProductManager productManager=new ProductManager();
    private Programmer programmer=new Programmer();
    private ArtDesigner artDesigner=new ArtDesigner();
    //项目经理协调工作
    public void work(){
        productManager.designProduct();
        programmer.writeProgarmm();
        artDesigner.designArt();
    }
}
/**
 * 门面客户端
 */
public class TestFacade {
    public static void main(String[] args) {
        ProjectManager projectManager=new ProjectManager();
        projectManager.work();
    }
}

【运行结果】

【门面模式 优点】

* 减少系统的相互依赖

所有的依赖都是对门面对象的依赖,与子系统无关。

* 提高了系统的灵活性

依赖减少了,灵活性自然就提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。

* 提高安全性

想让你访问子系统的哪些业务就开通哪些业务,不在门面上开通的方法则无法访问。

【门面模式 缺点】

不符合开闭原则,对修改关闭,对扩展开放。子系统有修改的情况,唯一能修改的就是门面角色的代码。

【门面模式 使用场景】

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

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

* 预防低水平人员带来的风险扩散

【门面模式 注意事项】

一般情况下,一个子系统主要有一个门面就够了。

下面情况可能会有多个门面:

* 门面已经庞大到不能忍受的地步

如果一个纯洁的门面对象已经超过了200行代码,虽然都是简单的委托操作,也建议拆成多个门面,否则会带来维护和扩展的麻烦。如何拆分呢?按照功能拆分是非常好的原则:如一个操作数据库的门面类可以拆分成:查询门面类、删除门面类、更新门面类。

* 子系统可以提供不同的访问路径

ClassA、ClassB、ClassC是一个子系统中的3对独享,现在有两个不用的高层模块想要访问该子系统,模块一可以完整地访问所有业务逻辑,也就是代码中的Facade类,它是子系统的信任模块。二模块二可以是受限制访问对象,只能访问ClassB的methodB()方法。

原文地址:https://www.cnblogs.com/HigginCui/p/6229390.html