Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈JAVA设计模式之——外观模式(Facade)

浅谈JAVA设计模式之——外观模式(Facade)

作者头像
冰河
发布于 2020-10-29 07:42:55
发布于 2020-10-29 07:42:55
62200
代码可运行
举报
文章被收录于专栏:冰河技术冰河技术
运行总次数:0
代码可运行

文末有福利!!!!!

一、概述

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

二、适用性

  • 为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越 复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容 易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需 要更多的可定制性的用户可以越过facade层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客 户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们 之间的依赖关系。

三、参与者

  • Facade 知道哪些子系统类负责处理请求。将客户的请求代理给适当的子系统对象。
  • Subsystemclasses 实现子系统的功能。处理由Facade对象指派的任务。没有facade的任何相关信息;即没有指向facade的指针。

四、类图

五、示例

  • Facade
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lyz.design.facade;
/**
 * Facade 
 * @author binghe
 *
 */
public class Facade {
    ServiceA sa;
    ServiceB sb;
    ServiceC sc;
    public Facade() {
        sa = new ServiceAImpl();
        sb = new ServiceBImpl();
        sc = new ServiceCImpl(); 
    }

    public void methodA() {
        sa.methodA();
        sb.methodB();
    }

    public void methodB() {
        sb.methodB();
        sc.methodC();
    }

    public void methodC() {
        sc.methodC();
        sa.methodA();
    }
}
  • Subsystemclasses 服务A
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lyz.design.facade;
/**
 * Subsystemclasses 
 * @author binghe
 *
 */
public class ServiceAImpl implements ServiceA {
    public void methodA() {
        System.out.println("这是服务A");
    }
}

服务B

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lyz.design.facade;
/**
 * Subsystemclasses 
 * @author binghe
 *
 */
public class ServiceBImpl implements ServiceB {
    public void methodB() {
        System.out.println("这是服务B");
    }
}

服务C

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lyz.design.facade;
/**
 * Subsystemclasses 
 * @author binghe
 *
 */
public class ServiceCImpl implements ServiceC {
    public void methodC() {
        System.out.println("这是服务C");
    }
}
  • Test
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lyz.design.facade;
/**
 * Test
 * @author binghe
 *
 */
public class Test {
    public static void main(String[] args) {
        ServiceA sa = new ServiceAImpl();
        ServiceB sb = new ServiceBImpl();
        sa.methodA();
        sb.methodB();
        System.out.println("========");
        //facade
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
    }
}
  • result
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
这是服务A
这是服务B
========
这是服务A
这是服务B
这是服务B
这是服务C

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈JAVA设计模式之——代理模式(proxy)
一、概述 为其他对象提供一种代理以控制对这个对象的访问。 二、适用性 远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。 虚代理(VirtualProxy)根据需要创建开销很
冰河
2020/10/29
3950
浅谈JAVA设计模式之——代理模式(proxy)
「聊设计模式」之外观模式(Facade)
🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!
bug菌
2023/11/09
4210
「聊设计模式」之外观模式(Facade)
浅谈JAVA设计模式之——适配器模式(Adapter)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
冰河
2020/10/29
4990
浅谈JAVA设计模式之——适配器模式(Adapter)
浅谈JAVA设计模式之——策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
冰河
2020/10/29
3470
浅谈JAVA设计模式之——策略模式(Strategy)
浅谈JAVA设计模式之——命令模式(Command)
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
冰河
2020/10/29
3700
浅谈JAVA设计模式之——命令模式(Command)
浅谈JAVA设计模式之——迭代器模式(interator)
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
冰河
2020/10/29
4140
浅谈JAVA设计模式之——迭代器模式(interator)
浅谈JAVA设计模式之——状态模式(State)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
冰河
2020/10/29
7500
浅谈JAVA设计模式之——状态模式(State)
浅谈JAVA设计模式之——装饰模式(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
冰河
2020/10/29
3190
浅谈JAVA设计模式之——装饰模式(Decorator)
浅谈JAVA设计模式之——模板方法(TemplateMethod)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
冰河
2020/10/29
3740
浅谈JAVA设计模式之——模板方法(TemplateMethod)
浅谈JAVA设计模式之——享元模式(Flyweight)
文末有福利!!!!! 一、概述 运用共享技术有效地支持大量细粒度的对象。 二、适用性 当都具备下列情况时,使用Flyweight模式: 一个应用程序使用了大量的对象。 完全由于使用大量的对象,造成很大的存储开销。 对象的大多数状态都可变为外部状态。 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。 三、参与者 Flyweight 描述一个接口,通过这个接口flyweight
冰河
2020/10/29
4140
浅谈JAVA设计模式之——享元模式(Flyweight)
浅谈JAVA设计模式之——访问者模式(Visitor)
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
冰河
2020/10/29
7470
浅谈JAVA设计模式之——访问者模式(Visitor)
浅谈JAVA设计模式之——桥接模式(Bridge)
1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
冰河
2020/10/29
5090
浅谈JAVA设计模式之——桥接模式(Bridge)
浅谈JAVA设计模式之——组合模式(Composite)
将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对象的使用具有一致性。
冰河
2020/10/29
4090
浅谈JAVA设计模式之——组合模式(Composite)
浅谈JAVA设计模式之——原型模式(Prototype)
一、概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 二、适用性 当一个系统应该独立于它的产品创建、构成和表示时。 当要实例化的类是在运行时刻指定时,例如,通过动态装载。 为了避免创建一个与产品类层次平行的工厂类层次时。 当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 三、参与者 Prototype 声明一个克隆自身的接口。 ConcretePrototype 实现一个克隆自身的操作。 Client
冰河
2020/10/29
2530
浅谈JAVA设计模式之——原型模式(Prototype)
浅谈JAVA设计模式之——观察者模式(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
冰河
2020/10/29
3470
浅谈JAVA设计模式之——观察者模式(Observer)
浅谈JAVA设计模式之——备忘录模式(Memento)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
冰河
2020/10/29
4800
浅谈JAVA设计模式之——备忘录模式(Memento)
浅谈JAVA设计模式之——中介者模式(Mediator)
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
冰河
2020/10/29
3450
浅谈JAVA设计模式之——中介者模式(Mediator)
【玩转23种Java设计模式】结构型模式篇:外观模式
  外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
程序员云帆哥
2022/05/12
1730
『设计模式』外观模式--这篇博客也太明了吧
外部与一个子系统的通信必须通过一个统一的外观(Facade)对象进行,这就是外观模式。
风骨散人Chiam
2020/10/28
2720
浅谈JAVA设计模式之——责任链模式(COR)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链, 并沿着这条链传递该请求,直到有一个对象处理它为止。这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者。
冰河
2020/10/29
5020
浅谈JAVA设计模式之——责任链模式(COR)
推荐阅读
相关推荐
浅谈JAVA设计模式之——代理模式(proxy)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档