当前位置:首页 > 科技  > 软件

一文彻底搞明白外观模式

来源: 责编: 时间:2024-05-11 09:20:22 267观看
导读本篇讲解Java设计模式中的外观模式,分为定义、模式应用前案例、结构、模式应用后案例、适用场景、模式可能存在的困惑和本质探讨7个部分。定义外观模式是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高

本篇讲解Java设计模式中的外观模式,分为定义、模式应用前案例、结构、模式应用后案例、适用场景、模式可能存在的困惑和本质探讨7个部分。zYM28资讯网——每日最新资讯28at.com

定义

外观模式是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。zYM28资讯网——每日最新资讯28at.com

在新的分类方式中,外观模式被划分至类之间的交互类别中,其简化的是一个类与一组类之间的交互耦合问题。zYM28资讯网——每日最新资讯28at.com

zYM28资讯网——每日最新资讯28at.com

模式应用前案例

在外观模式中,列举一个电商领域的案例。先来看一下未使用外观模式前的代码实现。zYM28资讯网——每日最新资讯28at.com

电商领域通常包括库存子系统、支付子系统和物流子系统,代码如下。zYM28资讯网——每日最新资讯28at.com

public class InventorySystem {//库存子系统    public void updateInventory(String product, int quantity) {        System.out.println("Updating inventory for " + product + ": " + quantity);    }}public class PaymentSystem {//支付子系统    public void processPayment(double amount) {        System.out.println("Processing payment: $" + amount);    }}public class ShippingSystem {//物流子系统    public void shipOrder(String address) {        System.out.println("Shipping order to address: " + address);    }}

调用方代码如下。zYM28资讯网——每日最新资讯28at.com

public class Client {//调用方代码    public static void main(String[] args) {        InventorySystem inventory = new InventorySystem();        PaymentSystem payment = new PaymentSystem();        ShippingSystem shipping = new ShippingSystem();        inventory.updateInventory("Computer", 1);        payment.processPayment(1500);        shipping.shipOrder("123 Main Street");    }}

在上述代码中,不难发现,调用方与各个子系统直接耦合,这样主要带来两个问题。zYM28资讯网——每日最新资讯28at.com

一个问题是调用方需要知晓每一个子系统的细节。在某些情况下,这些子系统之间的关系也需要知晓。zYM28资讯网——每日最新资讯28at.com

另一个问题是如果子系统代码发生变更,调用方代码也需要受到关联影响。zYM28资讯网——每日最新资讯28at.com

结构

zYM28资讯网——每日最新资讯28at.com

外观模式的示例代码如下。zYM28资讯网——每日最新资讯28at.com

public class SubSystemOne {    public void MethodOne() {        System.out.println("Called SubSystemComponentOne's methodOne()");    }}public class SubSystemTwo {    public void MethodTwo() {        System.out.println("Called SubSystemComponentTwo's MethodTwo()");    }}public class SubSystemThree {    public void MethodThree() {        System.out.println("Called SubSystemComponentThree's methodThree()");    }}public class SubSystemFour {    public void MethodFour() {        System.out.println("Called SubSystemComponentFour's MethodFour()");    }}public class Facade {    private SubSystemOne componentOne;    private SubSystemTwo componentTwo;    private SubSystemThree componentThree;    private SubSystemFour componentFour;    public Facade() {        componentOne = new SubSystemOne();        componentTwo = new SubSystemTwo();        componentThree = new SubSystemThree();        componentFour = new SubSystemFour();    }    public void MethodA() {        componentOne.MethodOne();        componentTwo.MethodTwo();        componentThree.MethodThree();    }    public void MethodB() {        componentTwo.MethodTwo();        componentThree.MethodThree();        componentFour.MethodFour();    }}public class Client {    public static void main(String[] args) {        Facade facade = new Facade();        // 客户端只需要调用外观类提供的接口        facade.MethodA();        facade.MethodB();    }}

模式应用后案例

上述电商领域的案例,在应用外观模式之后的代码实现如下。zYM28资讯网——每日最新资讯28at.com

库存子系统、支付子系统和物流子系统的代码不变。zYM28资讯网——每日最新资讯28at.com

public class InventorySystem {//库存子系统    public void updateInventory(String product, int quantity) {        System.out.println("Updating inventory for " + product + ": " + quantity);    }}public class PaymentSystem {//支付子系统    public void processPayment(double amount) {        System.out.println("Processing payment: $" + amount);    }}public class ShippingSystem {//物流子系统    public void shipOrder(String address) {        System.out.println("Shipping order to address: " + address);    }}

按照外观模式,增加了一个外观类。zYM28资讯网——每日最新资讯28at.com

public class OrderFacade {//订单外观类    private final InventorySystem inventory;    private final PaymentSystem payment;    private final ShippingSystem shipping;    public OrderFacade() {        this.inventory = new InventorySystem();        this.payment= new PaymentSystem();        this.shipping= new ShippingSystem();    }    //提供一个简化方法来处理整个订单流程    public void placeOrder(String product, int quantity,double amount,String address){        this.inventory.updateInventory(product,quantity);        this.payment.processPayment(amount);        this.shipping.shipOrder(address);    }}

最后,调用方代码修改如下。zYM28资讯网——每日最新资讯28at.com

public class Client {    public static void main(String[] args) {        //使用外观模式进行下单操作        OrderFacade facade= new OrderFacade();        facade.placeOrder("Computer", 1, 1500.00,"123 Main Street");    }}

可以看到,代码的复杂性已经挪到外观类中实现,调用方代码变得非常简洁清晰。zYM28资讯网——每日最新资讯28at.com

适用场景

外观模式适用于以下场景:zYM28资讯网——每日最新资讯28at.com

1、多个子系统或接口需要通过一定的交互共同为调用方服务,如果希望子系统后续可以相对调用方独立进行演进,可以考虑外观模式zYM28资讯网——每日最新资讯28at.com

2、需求实现新功能时,需要依赖企业中的遗留系统的功能。由于遗留系统通常后续会安排下线。此时就不建议将遗留系统的接口直接对调用方暴露,而是在一个外观类中封装新增加的功能和遗留系统功能zYM28资讯网——每日最新资讯28at.com

模式可能存在的困惑

困惑1:外观模式定义中提到的“界面”,具体是什么含义?zYM28资讯网——每日最新资讯28at.com

在外观模式中,多个子系统属于一个大的系统。界面可以理解为这个大系统对外暴露的契约接口。调用方只能通过界面来与系统进行交互。zYM28资讯网——每日最新资讯28at.com

本质

对于一个系统来讲,对外暴露清晰简洁的接口是非常有必要的。这不仅可以节省与调用方的沟通成本,也可以与调用方相对解耦,以便后续独立进行演进。zYM28资讯网——每日最新资讯28at.com

在系统建设初期,和调用方会制定契约接口。但是随着系统功能越来越多,经常会发现调用方需要依赖的接口越来越多,此时就可以将相互有关系的接口,再通过外观类这一层进行再封装,始终保持对外的简洁性。zYM28资讯网——每日最新资讯28at.com

此外,在外观模式下,外观类通常并不新增功能,仅仅是封装已有多个子系统的交互关系。zYM28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87982-0.html一文彻底搞明白外观模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 优化代码性能:C#中轻松测量执行时间

下一篇: 你真的知道 NPM、Yarn 与 PNPM 之间的区别吗?

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、“Ringdoll戒之人形”淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
Top