首页 > 代码库 > 15_门面模式

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()方法。

 

15_门面模式