服務(wù)定位器模式

服務(wù)定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務(wù)的時候闺鲸。考慮到為某個服務(wù)查找 JNDI 的代價很高悉罕,服務(wù)定位器模式充分利用了緩存技術(shù)。在首次請求某個服務(wù)時壁袄,服務(wù)定位器在 JNDI 中查找服務(wù),并緩存該服務(wù)對象涩僻。當再次請求相同的服務(wù)時栈顷,服務(wù)定位器會在它的緩存中查找,這樣可以在很大程度上提高應(yīng)用程序的性能萄凤。以下是這種設(shè)計模式的實體蛙卤。

服務(wù)(Service)?- 實際處理請求的服務(wù)。對這種服務(wù)的引用可以在 JNDI 服務(wù)器中查找到颤难。

Context / 初始的 Context?- JNDI Context 帶有對要查找的服務(wù)的引用已维。

服務(wù)定位器(Service Locator)?- 服務(wù)定位器是通過 JNDI 查找和緩存服務(wù)來獲取服務(wù)的單點接觸。

緩存(Cache)?- 緩存存儲服務(wù)的引用栅屏,以便復(fù)用它們堂鲜。

客戶端(Client)?- Client 是通過 ServiceLocator 調(diào)用服務(wù)的對象。

實現(xiàn)

我們將創(chuàng)建?ServiceLocator缔莲、InitialContext、Cache痴奏、Service?作為表示實體的各種對象。Service1?和?Service2?表示實體服務(wù)擅憔。

ServiceLocatorPatternDemo檐晕,我們的演示類在這里是作為一個客戶端,將使用?ServiceLocator?來演示服務(wù)定位器設(shè)計模式。

步驟 1

創(chuàng)建服務(wù)接口 Service篡石。

Service.java

public interface Service {

? public String getName();

? public void execute();

}

步驟 2

創(chuàng)建實體服務(wù)笛洛。

Service1.java

public class Service1 implements Service {

? public void execute(){

? ? ? System.out.println("Executing Service1");

? }

? @Override

? public String getName() {

? ? ? return "Service1";

? }

}

Service2.java

public class Service2 implements Service {

? public void execute(){

? ? ? System.out.println("Executing Service2");

? }

? @Override

? public String getName() {

? ? ? return "Service2";

? }

}

步驟 3

為 JNDI 查詢創(chuàng)建 InitialContext苛让。

InitialContext.java

public class InitialContext {

? public Object lookup(String jndiName){

? ? ? if(jndiName.equalsIgnoreCase("SERVICE1")){

? ? ? ? System.out.println("Looking up and creating a new Service1 object");

? ? ? ? return new Service1();

? ? ? }else if (jndiName.equalsIgnoreCase("SERVICE2")){

? ? ? ? System.out.println("Looking up and creating a new Service2 object");

? ? ? ? return new Service2();

? ? ? }

? ? ? return null;? ? ?

? }

}

步驟 4

創(chuàng)建緩存 Cache。

Cache.java

import java.util.ArrayList;import java.util.List;

public class Cache {

? private List<Service> services;

? public Cache(){

? ? ? services = new ArrayList<Service>();

? }

? public Service getService(String serviceName){

? ? ? for (Service service : services) {

? ? ? ? if(service.getName().equalsIgnoreCase(serviceName)){

? ? ? ? ? ? System.out.println("Returning cached? "+serviceName+" object");

? ? ? ? ? ? return service;

? ? ? ? }

? ? ? }

? ? ? return null;

? }

? public void addService(Service newService){

? ? ? boolean exists = false;

? ? ? for (Service service : services) {

? ? ? ? if(service.getName().equalsIgnoreCase(newService.getName())){

? ? ? ? ? ? exists = true;

? ? ? ? }?

?? ? } ?if(!exists){

? ? ? ? services.add(newService);

? ? ? }?

?}

}

步驟 5

創(chuàng)建服務(wù)定位器瘦材。

ServiceLocator.java

public class ServiceLocator {

? private static Cache cache;

? static {?

?? ? cache = new Cache();? ?

? }

? public static Service getService(String jndiName){

? ? ? Service service = cache.getService(jndiName);

? ? ? if(service != null){

? ? ? ? return service;

? ? ? }

? ? ? InitialContext context = new InitialContext();

? ? ? Service service1 = (Service)context.lookup(jndiName);

? ? ? cache.addService(service1);

? ? ? return service1;

? }

}

步驟 6

使用?ServiceLocator?來演示服務(wù)定位器設(shè)計模式食棕。

ServiceLocatorPatternDemo.java

public class ServiceLocatorPatternDemo {

? public static void main(String[] args) {

? ? ? Service service = ServiceLocator.getService("Service1");

? ? ? service.execute();

? ? ? service = ServiceLocator.getService("Service2");

? ? ? service.execute();

? ? ? service = ServiceLocator.getService("Service1");

? ? ? service.execute();

? ? ? service = ServiceLocator.getService("Service2");

? ? ? service.execute();? ? ?

? }

}

步驟 7

執(zhí)行程序错沽,輸出結(jié)果:

Looking up and creating a new Service1 objectExecuting Service1Looking up and creating a new Service2 objectExecuting Service2Returning cached? Service1 objectExecuting Service1Returning cached? Service2 objectExecuting Service2

本文轉(zhuǎn)載:https://www.runoob.com/design-pattern/design-pattern-intro.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末千埃,一起剝皮案震驚了整個濱河市憔儿,隨后出現(xiàn)的幾起案子放可,更是在濱河造成了極大的恐慌,老刑警劉巖蜈缤,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冯挎,死亡現(xiàn)場離奇詭異,居然都是意外死亡叠艳,警方通過查閱死者的電腦和手機易阳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拒课,“玉大人,你說我怎么就攤上這事早像。” “怎么了卢鹦?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵冀自,是天一觀的道長。 經(jīng)常有香客問我熬粗,道長,這世上最難降的妖魔是什么灌诅? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任含末,我火速辦了婚禮,結(jié)果婚禮上关带,老公的妹妹穿的比我還像新娘沼撕。我一直安慰自己,他們只是感情好务豺,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布嗦明。 她就那樣靜靜地躺著,像睡著了一般奔浅。 火紅的嫁衣襯著肌膚如雪诗良。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天舞骆,我揣著相機與錄音,去河邊找鬼督禽。 笑死,一個胖子當著我的面吹牛狈惫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忆肾,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼第岖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了郊酒?” 一聲冷哼從身側(cè)響起键袱,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褐健,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚜迅,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡俊抵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年徽诲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谎替。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钱贯,死狀恐怖挫掏,靈堂內(nèi)的尸體忽然破棺而出喷舀,到底是詐尸還是另有隱情淋肾,我是刑警寧澤爸邢,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站碌尔,受9級特大地震影響券敌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜待诅,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望募书。 院中可真熱鬧测蹲,春花似錦、人聲如沸扣甲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽示辈。三九已至,卻和暖如春顽耳,著一層夾襖步出監(jiān)牢的瞬間妙同,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工胰耗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芒涡,地道東北人柴灯。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓赠群,卻偏偏與公主長得像,于是被迫代替她去往敵國和親查描。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容