Java描述設(shè)計(jì)模式(12):外觀模式

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

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了五華免費(fèi)建站歡迎大家使用!

一、生活場(chǎng)景

1、場(chǎng)景描述

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

2、代碼圖解

Java描述設(shè)計(jì)模式(12):外觀模式

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、基本簡(jiǎn)介

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

2、模式圖解

Java描述設(shè)計(jì)模式(12):外觀模式

3、核心角色

  • 外觀角色

客戶端可以調(diào)用這個(gè)角色的方法。此角色具有相關(guān)的子模塊的功能。在正常情況下,本角色會(huì)將所有從客戶端發(fā)來(lái)的請(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)用更加簡(jiǎn)單。通過(guò)合理使用Facade,可以更好地劃分訪問(wèn)的層次。有些方法是對(duì)系統(tǒng)外的,有些方法是系統(tǒng)內(nèi)部使用的,把需要暴露給外部的功能集中到門面中。如果過(guò)多的使用外觀模式,會(huì)讓子模塊功能的維護(hù)變的復(fù)雜,一個(gè)功能方法改變,會(huì)牽扯到多個(gè)外觀對(duì)象的改變。

五、源代碼地址

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

Java描述設(shè)計(jì)模式(12):外觀模式

分享名稱:Java描述設(shè)計(jì)模式(12):外觀模式
當(dāng)前鏈接:http://bm7419.com/article2/gocjoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)微信小程序、搜索引擎優(yōu)化、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司