日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java描述设计模式(12):外观模式

發(fā)布時(shí)間:2025/3/17 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java描述设计模式(12):外观模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、生活場景

1、場景描述

在移動(dòng)互聯(lián)網(wǎng)沒有普及之前,去飯店吃飯的流程大致如下:選座位,排隊(duì),點(diǎn)菜,結(jié)賬。后來移動(dòng)互聯(lián)網(wǎng)普及,通過手機(jī)APP就可以操作這些流程,非常的方便快捷:通過手機(jī)可以知道某飯店是不是還有空位,到了飯店之后直接入座,然后通過手機(jī)點(diǎn)菜,結(jié)賬,中間省去了很多繁瑣的流程。

2、代碼圖解

3、代碼實(shí)現(xiàn)

/*** 外觀模式描述飯店就餐流程*/ public class C01_InScene {public static void main(String[] args) {EatAppFacade eatAppFacade = new EatAppFacade () ;eatAppFacade.dining();} } // 預(yù)定 class Booking {private static Booking booking = new Booking() ;public static Booking getInstance (){return booking ;}public void bookPlace (){System.out.println("位置預(yù)定...");} } // 點(diǎn)餐 class TakeOrder {private static TakeOrder takeOrder = new TakeOrder ();public static TakeOrder getInstance (){return takeOrder ;}public void orderDishes (){System.out.println("點(diǎn)餐...");} } // 付款 class Payment {private static Payment payment = new Payment () ;public static Payment getInstance (){return payment ;}public void payMoney (){System.out.println("結(jié)賬...");} } // 點(diǎn)餐APP class EatAppFacade {private Booking booking ;private TakeOrder takeOrder ;private Payment payment ;public EatAppFacade (){this.booking = Booking.getInstance() ;this.takeOrder = TakeOrder.getInstance() ;this.payment = Payment.getInstance() ;}// 就餐流程public void dining (){booking.bookPlace();takeOrder.orderDishes();payment.payMoney();} }

二、外觀設(shè)計(jì)模式

1、基本簡介

外觀模式是對(duì)象的結(jié)構(gòu)模式,客戶端與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行。外觀模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。

2、模式圖解

3、核心角色

  • 外觀角色

客戶端可以調(diào)用這個(gè)角色的方法。此角色具有相關(guān)的子模塊的功能。在正常情況下,本角色會(huì)將所有從客戶端發(fā)來的請(qǐng)求委派到相應(yīng)的子系統(tǒng)去。

  • 子模塊角色

可以同時(shí)有一個(gè)或者多個(gè)子模塊。每個(gè)子模塊都不是一個(gè)單獨(dú)的類,而是一個(gè)類的集合(如上面的子模塊就是由ModuleA、ModuleB、ModuleC三個(gè)類組合而成)。每個(gè)子系統(tǒng)都可以被客戶端直接調(diào)用,或者被外觀角色調(diào)用。子模塊并不知道外觀的存在,對(duì)于子模塊而言,外觀角色僅僅是另外一個(gè)客戶端。

  • 客戶端角色

外觀對(duì)象功能的調(diào)用者。

4、源代碼實(shí)現(xiàn)

public class C02_Facade {public static void main(String[] args) {Facade facade = new Facade();facade.clientNeed1();facade.clientNeed2();} } class ModuleA {public void testA (){System.out.println("ModuleA.testA()");} } class ModuleB {public void testB (){System.out.println("ModuleB.testB()");} } class ModuleC {public void testC (){System.out.println("ModuleC.testC()");} } class Facade {/*** 客戶需求1*/public void clientNeed1 (){ModuleA moduleA = new ModuleA();moduleA.testA();ModuleB moduleB = new ModuleB();moduleB.testB();}/*** 客戶需求1*/public void clientNeed2 (){ModuleB moduleB = new ModuleB();moduleB.testB();ModuleC moduleC = new ModuleC();moduleC.testC();} }

三、Mybatis應(yīng)用場景

1、使用場景

  • org.apache.ibatis.session.Configuration
  • org.apache.ibatis.reflection.MetaObject

Configuration 創(chuàng)建 MetaObject 的時(shí)候。

2、Configuration源碼

public class Configuration {protected ObjectFactory objectFactory;protected ObjectWrapperFactory objectWrapperFactory;public Configuration() {this.objectFactory = new DefaultObjectFactory();this.objectWrapperFactory = new DefaultObjectWrapperFactory();}public MetaObject newMetaObject(Object object) {return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory);}// ... 省去其他源碼 }

3、MetaObject 源碼

public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {return object == null ? SystemMetaObject.NULL_META_OBJECT : new MetaObject(object, objectFactory, objectWrapperFactory); }

四、優(yōu)缺點(diǎn)總結(jié)

松散了客戶端與子模塊的耦合關(guān)系,使子模塊功能的調(diào)用更加簡單。通過合理使用Facade,可以更好地劃分訪問的層次。有些方法是對(duì)系統(tǒng)外的,有些方法是系統(tǒng)內(nèi)部使用的,把需要暴露給外部的功能集中到門面中。如果過多的使用外觀模式,會(huì)讓子模塊功能的維護(hù)變的復(fù)雜,一個(gè)功能方法改變,會(huì)牽扯到多個(gè)外觀對(duì)象的改變。

五、源代碼地址

GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent

總結(jié)

以上是生活随笔為你收集整理的Java描述设计模式(12):外观模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。