博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一天一种设计模式之十一-----外观模式
阅读量:5773 次
发布时间:2019-06-18

本文共 1850 字,大约阅读时间需要 6 分钟。

hot3.png

一.外观模式简介

  1. 外观模式属于结构型模式。

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

  3. 当你要为一个复杂的系统提供一个简单的接口时,子系统往往因为不断演化而变的越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具有可重用性,更容易对子系统进行定制,但这也会给那些不需要定制子系统的用户带来一些使用上的困难。

  4. 外观模式为了解决3的痛点,提供了一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过外观层。

  5. 客户程序与抽象类的实现部分存在着很大的依赖性,引入外观模式可以将这个子系统与客户以及其他子系统分离,可以提高子系统的独立性和可移植性。

  6. 优点:

    1. 引入外观模式,客户对子系统的使用变得简单了。减少了与子系统的关联对象,实现了子系统与客户之间的松耦合。

    2. 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类

    3. 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程。

  7. 缺点:

    1. 不能很好的限制客户使用子系统类,如果堆客户访问子系统做太多的限制则减少了灵活性和可变性。

    2. 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源码,违背了开闭原则。

  8. 个人感觉,外观类只不过把具体的业务逻辑模块化了,这样的聚合在层次鲜明,耦合本身比较低或者逻辑流程比较统一的业务中值得考虑,但但业务流转的太复杂有可能导致父系统上面又聚合父系统,这样层次关系会很乱。所以这种模式不值得在复杂多变的逻辑处理中推荐。

二.测试代码

public class WaiguanMoshiTest {    public static void main(String[] args) {        Facade facade=new Facade();        facade.methodA();        facade.methodB();    }}interface ServiceA{    void methodA();}interface ServiceB{    void methodB();}interface ServiceC{    void methodC();}class ServiceAimpl implements ServiceA{    @Override    public void methodA() {        System.out.println("服務a");    }    }class ServiceBimpl implements ServiceB{    @Override    public void methodB() {        System.out.println("服務b");    }    }class ServiceCimpl implements ServiceC{    @Override    public void methodC() {        System.out.println("服務c");    }    }class Facade{    ServiceA serviceA;    ServiceB serviceB;    ServiceC serviceC;    public Facade(){        serviceA=new ServiceAimpl();        serviceB=new ServiceBimpl();        serviceC=new ServiceCimpl();    }    public void methodA(){        serviceA.methodA();        serviceB.methodB();    }    public void methodB(){        serviceB.methodB();        serviceC.methodC();    }    public void methodC(){        serviceC.methodC();        serviceA.methodA();    }}

转载于:https://my.oschina.net/u/2323537/blog/640601

你可能感兴趣的文章
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
java入门第二季--封装--什么是java中的封装
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
NodeJS 工程师必备的 8 个工具
查看>>
CSS盒模型
查看>>
ng2路由延时加载模块
查看>>
使用GitHub的十个最佳实践
查看>>
全面了解大数据“三驾马车”的开源实现
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>