外观模式

外观模式在软件设计中扮演简化接口的角色,减少客户端与子系统间的耦合。微服务网关作为外观模式的一个实例,整合多个微服务,使客户端能通过单一接口完成复杂业务。本文通过生活场景及代码示例解释了外观模式的概念和作用,强调其降低学习和调用成本的优势,并提醒适度使用的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外观模式我觉得应该是很多人说的门面模式。现在流行的微服务网关我认为就是一个外观模式的经典体现。他是建立在外观模式基础上构建的更复杂的模式。掌握了外观模式就会很容易理解微服务网关的作用。

 

                                                                                                                                                                                                                                                                                             场景问题

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

生活场景

现在你要需要电脑(当然重点不是电脑),而是你需要电脑,就需要去市场买电脑各个配件。你需要挨个挨个的去各个配件店里买配件,然后才能回家组装。但是随着社会的发展,就会产生一些新的服务行业,比如装机公司,于是形成下面的商业模式

 

好了,现在你只需要把需求告诉装机公司,通过访问装机公司,然后告诉它你的需求,然后它会调用后面的配件店,最后组装一台你想要的电脑给你。你不需要知道市场上那么多的配件店以及每个配件的市场,价格,性能等等。服务公司总是让客户朝着傻逼的方向发展的。这个是不会有问题的。

 

引入问题

 

如何实现,才能让客户端技能简单的使用系统的各个子模块,而又不需要客户端去和子模块交互呢?

 

 

                                                                                                                                解决方案

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

术语解释

界面

        这里说的界面不是GUI,而是指的门面,就是客户端需要面对的对象

接口

        这里说的接口不是Java中的interface,而是客户所面对的对象给客户提供出来的一套交互服务,可以是方法。

模块

        在微服务中就是各个微服务系统,在单体中就是内部的各个业务模块,各个模块不知道门面,但是门面知道各个模块

 

外观(门面)提供接口给客户端,客户不需要知道具体的模块,客户只需要和外观之间约定好需求就行。外观(门面)会屏蔽客户和具体模块。

 

示例代码

外观模式的结构如图过于抽象,因此将他们具体化。

假设子系统又三个模块,分别是AModule,BModule,CModule

 

public interface AModuleApi {

    void testA();

}

public class AModuleImplimplements AModuleApi {

    @Override

    public void testA() {

        System.out.println("testA方法执行...");

    }

}

BModuleApi和CModuleApi和上面一样的写法,然后写门面类,门面类提供给调用者接口,调用者通过门面的接口就可以完成个模块的组合调用

public class Facade {

    /**

    * 示意方法,满足客户需要的功能

    */

    public void test(){

        AModuleApi a =new AModuleImpl();

        BModuleApi b =new BModuleImpl();

        CModuleApi c =new CModuleImpl();

        a.testA();

        b.testB();

        c.testC();

    }

}

 

入口调用

public static void main(String[] args) {

    new Facade().test();

}

 

 

 

                                                                                                                                         模式说明

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

外观模式不是给系统添加新的功能接口,而是为了减少调用者和功能接口间的耦合。

外观是作为子系统对外的接口出现的,虽然也可以再外观里定义一些子系统没有的功能,但是不建议也没必要这么做。

 

外观应该是包装已经有的若干功能,组合起来提供给客户,而不是添加新得实现

也许各位看官会说,不就是把各个模块得功能挪到Facade类中嘛,这就叫设计模式?

没错,这就是外观模式。外观模式是系统这边的。如果调用方需要频繁的调用ABC各个模块,那么完全可以将他们组装到外观中。这样一来好处多多,客户不必知道ABC各个细节了,直接一个外观就搞定了,如果客户仅仅是只需要调用一个功能接口那也就没必要同年过外观,也可以直接调用模块功能。

 

因为现在一个系统会拆分成各个晓得业务系统,每个业务系统也会根据功能拆分成更小的系统。如果不适用外观模式,那么意味着调用者就会跟很多微服务(模块)打交道,这时候会加大学习成本,加大调用成本,如果我们充分利用好外观模式,客户只需要面对门面,无需了解里面的具体。这样系统才会更好 

 

外观模式简单易用,体现了最少知识原则。但是一定程度上外观模式也不可滥用。

 

 

外观模式的延申就是微服务中的网关,思考一下

网关中配置了各个模块子系统,每个子系统提供了接口

只需要访问网关去调用接口,那么接口会组装各个功能,最终实现客户需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值