<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      本文源碼:GitHub·點(diǎn)這里
      <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Fcicadasmile%2Fmodel-arithmetic-parent>
      ||GitEE·點(diǎn)這里
      <https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgitee.com%2Fcicadasmile%2Fmodel-arithmetic-parent>

      一、生活場(chǎng)景

      1、場(chǎng)景描述


      在移動(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)用場(chǎng)景

      1、使用場(chǎng)景

      * 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

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          天天操天天干天天 | 意大利少妇愉情理伦片 | 老熟女露脸嗷嗷叫91 | 日韩二区在线 | 欧美乱伦一区二区三区 | 黄视频在线 | 天天爱天天干天天爽 | 操小妇逼逼bb | 免费观看一级毛片 | 天天日夜夜草 |