最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之外觀模式

 更新時(shí)間:2022年10月11日 09:08:05   作者:tianClassmate  
這篇文章介紹了Java設(shè)計(jì)模式之外觀模式,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文通過老王改造小王公司的整體架構(gòu)來說明外觀模式,所謂的外觀模式其實(shí)就是在各種復(fù)雜的子系統(tǒng)中抽象出來一個(gè)接口,隱藏具體的實(shí)現(xiàn)細(xì)節(jié),調(diào)用方調(diào)用時(shí)只需要調(diào)用接口即可。為了加深理解我們會(huì)選出外觀模式在源碼中的應(yīng)用進(jìn)行重點(diǎn)的介紹,最后是我對(duì)設(shè)計(jì)模式學(xué)習(xí)過程中的一些思考。

讀者可以拉取完整代碼到本地進(jìn)行學(xué)習(xí),實(shí)現(xiàn)代碼均測試通過后上傳到碼云,本地源碼下載。

一、引出問題

隨著小王創(chuàng)業(yè)的不斷深入,公司各個(gè)業(yè)務(wù)模塊越來越復(fù)雜,每當(dāng)客戶們與他的合作時(shí)都要深入各個(gè)模塊內(nèi)部,而且客戶要依賴小王的各個(gè)模塊,給使用模塊的客戶帶來了困難。

小王就想請(qǐng)老王幫他規(guī)劃一下公司的架構(gòu)。

老王聽完了小王的需求,開始給他分析問題。

現(xiàn)在的公司的架構(gòu)已經(jīng)演變的相當(dāng)復(fù)雜了,客戶訪問你的時(shí)候都要通過各個(gè)子系統(tǒng),你應(yīng)該將你所有的子系統(tǒng)整合到一個(gè)前天(接口),客戶訪問你的子系統(tǒng)只需要通過這個(gè)前臺(tái)(接口)即可。這樣就能很好的解決這個(gè)問題。

二、概念與運(yùn)用

老王提出來的解決辦法正是外觀模式,是一種通過為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問的模式。

該模式對(duì)外有一個(gè)統(tǒng)一接口,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體細(xì)節(jié),這樣會(huì)大大降低應(yīng)用程序的復(fù)雜度,提高了程序的可維護(hù)性。

該模式應(yīng)該是包含兩個(gè)角色:

①各個(gè)子系統(tǒng)角色

②外觀角色

我們接著看其實(shí)現(xiàn)代碼:

子系統(tǒng):

/**
 * @author tcy
 * @Date 11-08-2022
 */
public class SystemWork01 {
    public void method1() {
        System.out.println("子系統(tǒng)01的業(yè)務(wù)模式!");
    }
}

/**
 * @author tcy
 * @Date 11-08-2022
 */
public class SystemWork02 {
    public void method1() {
        System.out.println("子系統(tǒng)02的業(yè)務(wù)模式!");
    }
}

/**
 * @author tcy
 * @Date 11-08-2022
 */
public class SystemWork03 {
    public void method1() {
        System.out.println("子系統(tǒng)03的業(yè)務(wù)模式!");
    }
}

外觀角色:

/**
 * @author tcy
 * @Date 11-08-2022
 */
public class Facade {
    private SystemWork01 obj1 = new SystemWork01();
    private SystemWork02 obj2 = new SystemWork02();
    private SystemWork03 obj3 = new SystemWork03();
    public void method() {
        obj1.method1();
        obj2.method1();
        obj3.method1();
    }
}

客戶端:

/**
 * @author tcy
 * @Date 11-08-2022
 */
public class Client {
    public static void main(String[] args) {
        Facade f = new Facade();
        f.method();
    }

}

外觀模式的實(shí)現(xiàn)代碼很簡單,讀者想必看一遍就知道什么意思了。但學(xué)會(huì)和會(huì)用是兩碼事,我們舉一些外觀模式以便讀者在使用時(shí)可以參考代碼。

三、應(yīng)用

看似外觀模式很簡單,實(shí)際應(yīng)用中應(yīng)該不多,其實(shí)在實(shí)際應(yīng)用中處處有體現(xiàn),比如Java開發(fā)學(xué)習(xí)的第一個(gè)框架肯定就是SSM,而SSM采用分層,而各個(gè)層之間的訪問就是外觀模式的體現(xiàn)。

還有就是我們?cè)诰S護(hù)一個(gè)復(fù)雜的系統(tǒng)時(shí),新系統(tǒng)不得不依賴?yán)舷到y(tǒng)的某些功能,那使用外觀模式是最合適不過的。

在Mybatis的Configuration就是使用的外觀模式。

客戶端使用Mybatis的功能時(shí),只需要調(diào)用Configuration的功能即可。

我們簡單看下Configuration的源碼。

 //Configuration 類:
public class Configuration {
	protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
	protected ObjectFactory objectFactory = new DefaultObjectFactory();
  	protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();

	 public MetaObject newMetaObject(Object object) {
    	return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
    }
}

//MetaObject類
public class MetaObject {
	private Object originalObject;
	private ObjectWrapper objectWrapper;
	private ObjectFactory objectFactory;
	private ObjectWrapperFactory objectWrapperFactory;
	private ReflectorFactory reflectorFactory;

	public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
    	if (object == null) {
    		return SystemMetaObject.NULL_META_OBJECT;
    	} else {
      		return new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
    	}
 	}

	private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
    	this.originalObject = object;
    	this.objectFactory = objectFactory;
    	this.objectWrapperFactory = objectWrapperFactory;
   		this.reflectorFactory = reflectorFactory;

    	if (object instanceof ObjectWrapper) {
      		this.objectWrapper = (ObjectWrapper) object;
    	} else if (objectWrapperFactory.hasWrapperFor(object)) {
      		this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
    	} else if (object instanceof Map) {
      		this.objectWrapper = new MapWrapper(this, (Map) object);
    	} else if (object instanceof Collection) {
     		this.objectWrapper = new CollectionWrapper(this, (Collection) object);
    	} else {
      		this.objectWrapper = new BeanWrapper(this, object);
  		}
	}
}

在使用MetaObject時(shí),客戶端只需要調(diào)用Configuration的newMetaObject(Object object)方法,并傳遞一個(gè)Object參數(shù),就可以獲取對(duì)應(yīng)的MetaObject。

至于具體的產(chǎn)生什么樣的MetaObject,則有MetaObject的類的forObject(object, objectFactory, objectWrapperFactory, reflectorFactory)方法實(shí)現(xiàn)。

具體深究Mybatis 的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)還是很麻煩的,這里是淺談一下,有興趣的讀者可以拉Mybatis源碼進(jìn)行重點(diǎn)學(xué)習(xí)。

四、總結(jié)

前幾天在一個(gè)技術(shù)公眾號(hào)上看到了一個(gè)爭論,關(guān)于設(shè)計(jì)模式在新手期要不要學(xué)的問題,一些人的觀點(diǎn)就是新手壓根看不懂設(shè)計(jì)模式,看懂了實(shí)際開發(fā)也不會(huì)用。

另外一派的觀點(diǎn)則是,設(shè)計(jì)模式一定要學(xué),在你開發(fā)中慢慢訓(xùn)練有意識(shí)的使用設(shè)計(jì)模式,在你開發(fā)了一段時(shí)間的系統(tǒng)后再學(xué)習(xí)設(shè)計(jì)模式的話,那時(shí)候你壓根沒有時(shí)間去重構(gòu)你的代碼。

我的觀點(diǎn)更趨向于后者,自從我學(xué)了設(shè)計(jì)模式以后,再寫代碼的時(shí)候,尤其是在老代碼之上加一些新功能時(shí),我會(huì)下意識(shí)的回憶一下學(xué)過的設(shè)計(jì)模式,思考使用設(shè)計(jì)模式對(duì)我的代碼有沒有幫助。

學(xué)過設(shè)計(jì)模式以后,在日常開發(fā)中技術(shù)水平不知不覺就提高了,不像以前那樣為了實(shí)現(xiàn)功能而實(shí)現(xiàn)功能。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 詳解Spring Security中權(quán)限注解的使用

    詳解Spring Security中權(quán)限注解的使用

    這篇文章主要為大家詳細(xì)介紹一下Spring Security中權(quán)限注解的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下
    2022-05-05
  • Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解

    Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • JAVA文件讀取常用工具類(8種)

    JAVA文件讀取常用工具類(8種)

    JAVA操作文件在經(jīng)常會(huì)使用到,本文匯總了部分JAVA操作文件的讀取常用工具類,主要介紹了8種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • Java中四種訪問控制權(quán)限解析(private、default、protected、public)

    Java中四種訪問控制權(quán)限解析(private、default、protected、public)

    java當(dāng)中有4種訪問修飾限定符privat、default(默認(rèn)訪問權(quán)限),protected以及public,本文就詳細(xì)的介紹一下這四種方法的具體使用,感興趣的可以了解一下
    2023-05-05
  • JVM 的 noverify 啟動(dòng)參數(shù)問題解析

    JVM 的 noverify 啟動(dòng)參數(shù)問題解析

    這篇文章主要介紹了JVM 的 noverify 啟動(dòng)參數(shù)問題解析,從 JDK 13 開始及其后續(xù)版本中,不建議繼續(xù)使用?-Xverify:none?和-noverify?參數(shù),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 基于java實(shí)現(xiàn)顏色拾色器并打包成exe

    基于java實(shí)現(xiàn)顏色拾色器并打包成exe

    這篇文章主要為大家詳細(xì)介紹了如何基于java編寫一個(gè)簡單的顏色拾色器并打包成exe文件,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • xml 的特殊字符的處理方法

    xml 的特殊字符的處理方法

    在xml中,有一些符號(hào)作為XML 的標(biāo)記符號(hào),一些特定情況下,屬性值必須帶有這些特殊符號(hào)。 下面主要是講解一些常用的特殊符號(hào)的處理
    2016-07-07
  • 詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法

    詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法

    ByteArrayInputStream和ByteArrayOutputStream分別集成自InputStream和OutputStream這兩個(gè)輸入和輸出流,這里我們就來詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法,需要的朋友可以參考下
    2016-06-06
  • 解讀JVM的組成部分有什么

    解讀JVM的組成部分有什么

    JVM主要由類加載器子系統(tǒng)、運(yùn)行時(shí)數(shù)據(jù)區(qū)、執(zhí)行引擎和本地庫接口等組成,類加載器負(fù)責(zé)加載類文件,運(yùn)行時(shí)數(shù)據(jù)區(qū)管理內(nèi)存,執(zhí)行引擎執(zhí)行字節(jié)碼指令和垃圾回收,本地庫接口連接其他語言
    2025-03-03
  • SpringCloud Config配置中心原理以及環(huán)境切換方式

    SpringCloud Config配置中心原理以及環(huán)境切換方式

    這篇文章主要介紹了SpringCloud Config配置中心原理以及環(huán)境切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

巴马| 松滋市| 大田县| 正宁县| 晋江市| 德格县| 新田县| 安徽省| 尖扎县| 兴义市| 安岳县| 长岭县| 分宜县| 西城区| 徐州市| 六枝特区| 大安市| 横峰县| 资溪县| 务川| 新郑市| 绥阳县| 景东| 龙岩市| 丹巴县| 正阳县| 龙胜| 南郑县| 上思县| 石首市| 遵义市| 新民市| 密山市| 秀山| 尚志市| 台东县| 明星| 嫩江县| 新源县| 综艺| 紫金县|