由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

设计模式—门面模式

JAVA 西门飞冰 729℃
[隐藏]

1.定义

门面模式也叫外观模式

门面模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

门面模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节

image-20220926145255810

这是门面模式的结构图

image-20220926145424126

在这个结构图中,出现了两个⻆⾊:

  • ⻔⾯(Facade)⻆⾊ :客户端可以调⽤这个⻆⾊的⽅法。此⻆⾊知晓相关的(⼀个或者多个)⼦系统的功能和责任。在正常情况下,本⻆⾊会将所有从客户端发来的请求委派到相应的⼦系统去。
  • ⼦系统(SubSystem)⻆⾊ :可以同时有⼀个或者多个⼦系统。每个⼦系统都不是⼀个单独的类,⽽是⼀个类的集合(如上⾯的⼦系统就是由ModuleA、ModuleB、ModuleC三个类组合⽽成)。每个⼦系统都可以被客户端直接调⽤,或者被⻔⾯⻆⾊调⽤。⼦系统并不知道⻔⾯的存在,对于⼦系统⽽⾔,⻔⾯仅仅是另外⼀个客户端⽽已。

2.项目应用

我们现在有⼀个OA系统,OA要对外提供服务要经过三个步骤:

// 启动MySQL应用集群
public class DatabaseManager {
    public void startDbCluster(){
        System.out.println("正在启动mysql集群");
    }
}
// 启动Redis集群
public class CacheManager {
    public void initRedis(){
        System.out.println("正在启动redis集群");
    }
}
// 启动Web应用服务器
public class WebServerManager {
    public void startWebApp(){
        System.out.println("正在启动web服务器");
    }
}

如果没有额外操作,客户端必须手动运行这些组件,这极大提高了客户端的复杂度

public class Client {
    public static void main(String[] args) {
        new DatabaseManager().startDbCluster();
        new CacheManager().initRedis();
        new WebServerManager().startWebApp();
    }
}

好的做法是引入门面Facade,让应用开发方提供操作,为客户端提供最简单的操作入口即可

public class ApplicationFacade {
    private CacheManager cacheManager = new CacheManager();
    private DatabaseManager dbManager = new DatabaseManager();
    private WebServerManager webManager = new WebServerManager();
    public void initSystem(){
        dbManager.startDbCluster();
        cacheManager.initRedis();
        webManager.startWebApp();
    }
}

优化后的Client只需要⾯对ApplicationFacade⻔⾯,不需要再关注具体细节

public class Client {
    public static void main(String[] args) {
        ApplicationFacade app = new ApplicationFacade();
        app.initSystem();
    }
}

3.优缺点

3.1.优点

松散耦合: ⻔⾯模式松散了客户端与⼦系统的耦合关系,让⼦系统内部的模块能更容易扩展和维护。

简单易⽤: ⻔⾯模式让⼦系统更加易⽤,客户端不再需要了解⼦系统内部的实现,也不需要跟众多⼦ 系统内部的模块进⾏交互,只需要跟⻔⾯类交互就可以了。

更好的划分访问层次: 通过合理使⽤Facade,可以帮助我们更好地划分访问的层次。有些⽅法是对系 统外的,有些⽅法是系统内部使⽤的。把需要暴露给外部的功能集中到⻔⾯中,这样既⽅便客户端使 ⽤,也很好地隐藏了内部的细节。

3.2.缺点

不符合开闭原则,如果要修改某⼀个⼦系统的功能,通常门面类也要⼀起修改

转载请注明:西门飞冰的博客 » 设计模式—门面模式

喜欢 (0)or分享 (0)