日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java 外观模式类图_Java 设计模式——外观模式

發(fā)布時間:2024/3/26 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 外观模式类图_Java 设计模式——外观模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述

今天要說的外觀模式是一個相對簡單的設(shè)計模式,而且在日常的開發(fā)中,可能你也會時常使用它,只是你可能并未想過這是一個設(shè)計模式。本文會從一些實例著手,來對本文要說明的外觀模式進行盡可能全面的講解。希望于你有益。

引言

這里插入一條引言的目的是讓你回想一下,在你日常開發(fā)中何時用到了外觀模式。

可能你的 boss 會這樣安排你一個任務(wù)。這可能是一個核心模塊,模塊會有它的一個功能,只是你的 boss 可能只想要你提供一個給他調(diào)用的接口。他會這么跟你說:嗨,小明,我們現(xiàn)在的這個系統(tǒng)里需要一個核心的功能 P0,它就交給你實現(xiàn)吧。你只要給我可以調(diào)用的接口就好了,你代碼的內(nèi)部邏輯我不需要知道的。去做吧。

如果你時常被安排這樣的任務(wù),我想你應(yīng)該已經(jīng)掌握外觀模式了。

定義

外觀模式提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀模式定義一個高層接口,讓子系統(tǒng)更容易使用。

目錄

版權(quán)說明

著作權(quán)歸作者所有。

商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

本文作者:Q-WHai

發(fā)表日期: 2016年6月6日

本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51592617

來源:CSDN

更多內(nèi)容:分類 >> 設(shè)計模式

非外觀模式

這里我就使用《大話設(shè)計模式》書中的例子了,感覺這個例子還是挺形象的。現(xiàn)在假設(shè)你是一個股民(只是博主不炒股,也不知道這里會不會有說得不對的地方,如果有你就當(dāng)沒看見吧。。^_^),你想做一些理財活動。你看中了兩支股票、一支國債和一支房地產(chǎn)。

如果讓你現(xiàn)在來編寫這份代碼,你的代碼框架可能會像下面的這幅類圖:

這里只列舉了股票的代碼,是因為其他理財活動的邏輯與股票的邏輯是一致的。冗余的代碼除了占地方之外并沒有再多的好處了。

StockA.java

public class StockA {

private int stockCount = 0;

public void sell(int count){

stockCount -= count;

System.out.println("賣了" + count + "支 A 股票");

}

public void buy(int count){

stockCount += count;

System.out.println("買了" + count + "支 A 股票");

}

public int getStockCount() {

return stockCount;

}

}

下面的代碼是處理理財者的,對于一個簡單地買進買出邏輯,理財者都要花費這么多的代碼處理,實在是折磨人嘛。

Investors.java

public class Investors {

public static void main(String[] args) {

StockA stockA = new StockA();

StockB stockB = new StockB();

NationalDebt debt = new NationalDebt();

RealEstate estate = new RealEstate();

stockA.buy(100);

stockB.buy(200);

debt.buy(150);

estate.buy(120);

stockA.sell(100);

stockB.sell(200);

debt.sell(150);

estate.sell(120);

}

}

上面說的這些是在沒有使用外觀模式的情況下編寫的代碼。也就是說下面要說的外觀模式可以讓代碼更加簡單明了了。

外觀模式

在上面的非外觀模式中,我們看到了一些不是很友好的代碼邏輯。而外觀模式可以基于更高層次的封裝,從而達到對調(diào)用者更加透明。下面是修改后的外觀模式類圖:

FundFacade.java

public class FundFacade {

private StockA stockA = null;

private StockB stockB = null;

private NationalDebt debt = null;

private RealEstate estate = null;

public FundFacade() {

stockA = new StockA();

stockB = new StockB();

debt = new NationalDebt();

estate = new RealEstate();

}

public void buyAll(int count) {

stockA.buy(count);

stockB.buy(count);

debt.buy(count);

estate.buy(count);

}

public void sellAll(int count) {

stockA.sell(count);

stockB.sell(count);

debt.sell(count);

estate.sell(count);

}

public void buyStockA(int count) {

stockA.buy(count);

}

public void sellNationalDebt(int count) {

debt.sell(count);

}

}

上面的代碼則是外觀的核心類:FundFacade。在理財系統(tǒng)中的所有操作都可以通過這個類來實現(xiàn)。你通過這個類可以很方便地實現(xiàn)對股票、國債、房地產(chǎn)等理財項目的操作,而不用關(guān)心里面究竟是怎么處理的。這是對用戶來說是一件好事,不是嗎?

來看看用戶的操作吧(當(dāng)然上面圖類已經(jīng)反映了絕大部分效果了),這是用戶的代碼邏輯:

Investors.java

public class Investors {

public static void main(String[] args) {

FundFacade facade = new FundFacade();

facade.buyAll(120);

facade.buyStockA(50);

facade.sellAll(80);

}

}

看看,用戶只要告訴 FundFacade 類,買入什么、賣出什么、買多少、賣多少,就可以達到目的。實在是太方便了。

看看股票 A 的代碼吧,其實它并什么實質(zhì)性的變化。這也是外觀模式的魅力所在,它不用你去修改原來子系統(tǒng)的代碼,只要做一件事,構(gòu)建更高層次的封裝。當(dāng)然,這里我做了一些簡單地修改,StockA 的訪問權(quán)限。既然要對用戶透明,那么我的子系統(tǒng)就沒有必要再對用戶開放了,不是嗎?因為我們已經(jīng)有專業(yè)的外交官—— FundFacade。

StockA.java

class StockA {

private int stockCount = 0;

void sell(int count){

stockCount -= count;

System.out.println("賣了" + count + "支 A 股票");

}

void buy(int count){

stockCount += count;

System.out.println("買了" + count + "支 A 股票");

}

int getStockCount() {

return stockCount;

}

}

外觀模式是一個相對簡單的設(shè)計模式,你可以很輕松地掌握并使用它。只是我想說,外觀模式也會存在一定的局限性。相信你已經(jīng)發(fā)現(xiàn)了。

由于我們把對于子系統(tǒng)所有的操作都交給了 FundFacade 類來處理,所以我們就受到了 FundFacade 類的約束了。比如上面的 FundFacade 類中并沒有實現(xiàn)單獨對 StockB 的操作,那么我們就不能單獨對 StockB 進行操作了,除非你在 FundFacade 類中封裝一個對 StockB 操作的接口。

外觀模式的應(yīng)用

上面的描述中我們不僅知道了如何使用外觀模式,也了解了外觀模式的局限,所以我們應(yīng)該站在客觀的立場,有選擇性地使用它。這里說一個我在工作中使用外觀模式的例子吧。

目前項目的老大讓我去實現(xiàn)一個系統(tǒng)中的某一個模塊,我想這應(yīng)該是一個核心模塊吧。這個模塊的功能是,檢查一個文件夾下的所有文件是否包含了敏感信息。而這個模塊中會有很多小的子模塊(當(dāng)然老大并不會關(guān)心這些子模塊做的事情),比如 AC 自動機的模式匹配、壓縮文件的全自動解壓、各種格式文件(doc/xls/ppt/zip/eml/rtf/pdf 等等,絕大部分的文件格式基本都在吧)、日志系統(tǒng)等等。

我不可能去跟老大說,你要完成的功能是要先去干嘛、再去干嘛、再去干嘛、再去干嘛… …

哦,天啦。煩死了,你能對它封裝一下嗎?(當(dāng)然,這些只是我的心理活動。事實上,我還沒有讓老大說明我的設(shè)計過程)

封裝過后,我只要告訴老大,去調(diào)用這個類的這個方法就 ok 了。這樣老大那邊就不用操心里面的邏輯了,雖然如果出了錯就是你的責(zé)任,可那也本該就 是你的責(zé)任啊。哈哈。。。

好了,扯蛋就到這里。不管是上面正兒八經(jīng)地模式詳解,還是下面的胡說八道,我都希望它可以讓你充分了解本文這個設(shè)計模式,學(xué)習(xí)并合理使用它。

Ref

總結(jié)

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

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