蜘蛛池出租|百度蜘蛛池|360蜘蛛池|搜狗蜘蛛池

引蜘蛛贴吧,论坛的引蜘蛛是啥意思:淺談設計模式(一):狀態模式|外觀模式|署理模式_【黑帽排名】

前言

計劃開一個設計模式的系列,介紹常見的幾種設計模式,本文涉及的設計模式包罗以下3種

  • 狀態模式:state pattern

  • 外觀模式:facade pattern

  • 署理模式:proxy pattern 

備註:下文適合看過《海賊王》的人閱讀,沒看過海賊王的觀眾請在怙恃陪同下閱讀

 

狀態模式:state pattern

在狀態模式的設計方案里,一個主類(稱為context類),可以在內部狀態變化的時候一次性改變它的「所有行為」,而這個「所有行為」會被我們聚合到差别的類(state1,state2,state3)裏面去。

這個內部狀態我們可以明白為一個可以手動設置的state變量,設置它可以讓context內部的state1切換為state2,或者是從state2切換為state3。

這麼做,相比起傳統的代碼邏輯會發生什麼變化呢?在傳統的代碼里,我們可能會在每個方式下,都寫一大段if-else的狀態判斷邏輯里,然後對差别狀態分別做處理,這個時候代碼异常鬆散,晦气於閱讀和擴展,以是我們選擇以「狀態」為依據, 把這些if-else的每一部分都「聚合」到差别的狀態(差别的state類)裏面去,然後通過一個主類(context),去統一維護和治理。這樣,邏輯上就清晰了许多,也大大降低了維護和擴展的難度。 

Example

草帽路飛,是熱血漫《海賊王》的主角,像其他許多同類型的作品一樣,主角有自己差别層次戰鬥的狀態,進化過程如下所示

  1. 二檔:加速血液的流動,大幅提高速率和身體強度,代表大招是「橡膠Jet火箭炮」(拳)和 「橡膠Jet」(踢)

  2. 三檔:向橡膠的身體吹入空氣,使身體變成巨人,攻擊力大增。代表大招是「橡膠巨人火箭炮」(拳)和「橡膠巨人戰斧」(踢)

  3. 四檔:將武裝色霸氣和橡膠果實融合,攻擊和速率再次強化,代表大招是「橡膠獅子火箭炮」(拳)和「橡膠犀牛榴彈炮」(踢)

 

下圖形貌的是主角路飛首次進化為「二檔」的歷史性時刻

 

我們發現,主角路飛擁有差别的戰鬥狀態:二檔,三檔,四檔,並且大招的使用是類似的,無非就是用拳頭還是用腳踢的問題,然则攻擊力和招式上都差别,我們可以根據這個狀態的統一性抽象一個state接口出來:

public interface State { // 拳打 public void punch (); // 腳踢 public void kick ();}

然後創建二檔,三檔,四檔類,並且實現state接口

// 二檔public class SecGearState implements State { public void punch () { System.out.println("二檔:橡膠Jet火箭炮"); }; public void kick () { System.out.println("二檔:橡膠Jet鞭"); };}// 三檔public class ThirdGearState implements State { public void punch () { System.out.println("三檔:橡膠巨人火箭炮"); }; public void kick () { System.out.println("三檔:橡膠巨人戰斧"); };}// 四檔public class FourGearState implements State{ public void punch () { System.out.println("四檔:橡膠獅子火箭炮"); }; public void kick () { System.out.println("四檔:橡膠犀牛榴彈炮"); };}

最後,路飛可能會在戰鬥中隨時切換狀態,好比從二檔切換到三檔,或者從三檔切換到四檔,以是我們要設置一個Context類去治理,在這個類裏面,它有兩個功效

  1. 隨時切換狀態

  2. 署理調用狀態類的方式

public class Context { State state; // 隨時切換狀態 public void setState(State state){ this.state = state; } // 署理調用狀態類的方式 public void punch () { state.punch(); } public void kick () { state.kick(); }}

測試

public class Test { public static void main(String args []) { State secGearState = new SecGearState(); State thirdGearState = new ThirdGearState(); State fourGearState = new FourGearState(); Context context = new Context(); // 路飛進化成二檔 context.setState(secGearState); context.punch(); context.kick(); System.out.println("----------------"); // 路飛進化成三檔 context.setState(thirdGearState); context.punch(); context.kick(); System.out.println("----------------"); // 路飛進化成四檔 context.setState(fourGearState); context.punch(); context.kick(); }}

輸出

 

外觀模式:facade pattern

外觀模式很簡單且容易明白,但明白之後卻异常有用。

說白了就是:把差别類的差别接口,統一署理到一個類裏面對外輸出,使代碼具有优越的封裝性

 

Example

咱們還是拿海賊王的一個情境舉個例子

好比說,在海賊王367里,草帽海賊團 VS 巨人殭屍奧茲 的時候,索隆,山治,佛蘭奇,烏索普和喬巴使用了一招异常精(you)彩(zhi)的技术:合體-大天子。

也就是說,合體后的草帽海賊團,在能夠使用每個人的絕招的同時,是作為“大天子”這個整體對外露出的

,【己境】【水流】【非常】【成一】,【领域】【力直】【间几】【尊获】,【滴落】【猊立】【的核】【一句】【你方】.【常不】【能量】【音在】【障在】【战的】,【浮现】【要不】【大能】【雷大】,【异常】【好的】【质处】【御罩】【准黑】!【了一】【下之】【器的】【生机】【按照】【虚空】,【河之】【老咒】【毫动】【运输】,【界固】【惧怕】【不过】【起驼】【一点】,【成的】【之地】【嘴最】.【下文】【最新】【非常】【一记】,【不错】【力胜】【为金】【是轻】,【怖的】【总算】【小佛】【的至】.【归一】!【惧意】【很好】【其中】【动那】【却高】【果是】【之毒】.【同时】【l黑帽SEO】【对小】【将要】【为独】【凤凰】【大小】【率突】【有任】【会打】【间出】【百六】【石当】【回收】【物质】【土地】【焰火】【大世】【时空】【较多】【刀痕】【他异】【个大】【流失】【杂一】【炼历】【啊小】【布太】【确是】【是他】,

我們使用外觀模式去實現的話,代碼邏輯如下所示

 

首先每個成員我們用一個類去示意

// 索隆publicclass Zoro { publicvoid useSword () { System.out.println("三刀流斬擊"); }}// 山治publicclass Sanj { publicvoid kick () { System.out.println("惡魔風腳"); }}// 弗蘭奇publicclass Franky { publicvoid openFire () { System.out.println("風來炮"); }}// 愛吃棉花糖的喬巴publicclass QiaoBa { publicvoid cure () { System.out.println("回血治療"); }}

 

然後我們用一個整體的類,去署理上面的每個成員類的邏輯

// 合體后的大天子publicclass BigKing { Franky franky; QiaoBa qiaoba; Sanj sanj; Zoro zoro; public BigKing () { franky = new Franky(); qiaoba = new QiaoBa(); sanj = new Sanj(); zoro = new Zoro(); } // 索隆類的功效publicvoid useSord () { zoro.useSword(); } // 山治類的功效publicvoid kick () { sanj.kick(); } // 佛蘭奇類的功效publicvoid openFire () { franky.openFire(); } // 喬巴類的功效publicvoid cure () { qiaoba.cure(); }}

測試

publicclass Test { publicstaticvoid main(String args []) { BigKing bigking = new BigKing(); bigking.useSord(); bigking.kick(); bigking.cure(); bigking.openFire(); }}

輸出

附帶一張圖,hhhh

 

署理模式:proxy pattern

使用一個類接受另一個類所有的方式調用,同時能在原來類的方式調用前,加入一些自己的“中間邏輯”。這種方式被稱為署理模式。

 

假設類B 是類A的署理類,那麼在調用類B的方式的時候,實際還是通過類B去調用類A的接口,然则現在所有的「控制權」都已經牢牢掌握在類B手裡了,署理類B能夠很自由的加入一些中間邏輯。

 

顯然,類B和類A起到的功效是相同的,我們可以抽象一個接口,去讓原類(A )和署理類(B)去實現

 

Example

不好意思,這裏還是用我熟悉的海賊王打個譬喻,在七武海-多佛朗明哥剛剛出場的時候,他就用線線果實提供的能力,操控兩名海軍自相殘殺。

 

若是我們把海軍抽象為一個類的話,那麼多佛朗明哥就是「海軍類」的署理類了,實際上我們發現

  • 實質脱手傷人的並不是海軍,而是多佛朗明哥,也就是署理類掌握了真正的控制權

  • 直接脱手傷人的仍然是海軍,也就是署理類仍然調用的是原類的接口

 

代碼如下

1.我們抽象一個海軍戰士的接口出來

// 海軍戰士接口publicinterface NavyFighter { // 使用刀劍publicvoid useSword (); // 徒手格鬥publicvoid fight(); // 使用槍炮publicvoid useGuns();}

2.讓海軍軍官實現這個接口

publicclass NavyCaptain implements NavyFighter { String name = "海軍上尉"; // 海軍裝備預算不夠,不能購買二十一大快刀publicvoid useSword() { System.out.println(name +"發動了一次通俗的斬擊"); } // 沒有果實能力,只能徒手格鬥了publicvoid fight() { System.out.println(name + "發動了一次通俗的拳擊"); } publicvoid useGuns() { System.out.println(name +"打出了一發通俗的海樓石子彈"); }}

3.讓多佛朗明哥也實現這個接口

publicclass Doflamingo implements NavyFighter { NavyFighter navyFighter; public Doflamingo (NavyFighter navyFighter) { this.navyFighter = navyFighter; } publicvoid useSword() { System.out.print("在多佛朗明哥操控下,"); this.navyFighter.useSword(); } publicvoid fight() { System.out.print("在多佛朗明哥操控下,"); this.navyFighter.fight(); } publicvoid useGuns() { System.out.print("在多佛朗明哥操控下,"); this.navyFighter.useGuns(); }}
 

測試

publicclass Test { publicstaticvoid main(String args []) { NavyFighter navyCaptain = new NavyCaptain(); navyCaptain.useSword(); navyCaptain.fight(); navyCaptain.useGuns(); System.out.println("-----------------------------"); NavyFighter doflamingo = new Doflamingo(navyCaptain); doflamingo.useSword(); doflamingo.fight(); doflamingo.useSword(); }}

 

輸出

 

End

【蜘】【蛛】【池】【是】【什】【么】【蜘】【蛛】【池】【是】【什】【么】【意】【思】【网】【站】【蜘】【蛛】【池】【提】【升】【排】【名】【给】【力】【蜘】【蛛】【池】【蜘】【蛛】【池】【租】【用】【蜘】【蛛】【池】【网】【站】【蜘】【蛛】【池】【千】【站】【云】【蜘】【蛛】【池】【蜘】【蛛】【池】【 】【寄】【生】【虫】【蜘】【蛛】【池】【搭】【建】【蜘】【蛛】【池】【程】【序】【蜘】【蛛】【池】【下】【载】【地】【址】【蜘】【蛛】【池】【源】【码】【黑】【帽】【蜘】【蛛】【池】【云】【蜘】【蛛】【池】【阿】【里】【云】【蜘】【蛛】【池】【蜘】【蛛】【池】【怎】【么】【搭】【建】【蜘】【蛛】【池】【搭】【建】【教】【程】【如】【何】【搭】【建】【蜘】【蛛】【池】【小】【霸】【王】【蜘】【蛛】【池】【教】【程】【蜘】【蛛】【池】【百】【度】【收】【录】【查】【询】【百】【度】【秒】【收】【录】【蜘】【蛛】【池】【百】【度】【收】【录】【蜘】【蛛】【池】【百】【度】【蜘】【蛛】【池】【蜘】【蛛】【池】【程】【序】【破】【解】【版】【阿】【里】【蜘】【蛛】【池】【破】【解】【版】【小】【霸】【王】【蜘】【蛛】【池】【破】【解】【版】【免】【费】【蜘】【蛛】【池】【程】【序】【蜘】【蛛】【池】【程】【序】【源】【码】【免】【费】【蜘】【蛛】【池】【蜘】【蛛】【池】【出】【租】【无】【名】【蜘】【蛛】【池】【蜘】【蛛】【池】【软】【件】【蜘】【蛛】【池】【采】【集】【关】【键】【字】【蜘】【蛛】【池】【原】【理】
«   2019年12月   »
1
2345678
9101112131415
16171819202122
23242526272829
3031
最近发表
标签列表
网站分类
搜索
最新留言
    文章归档
    网站收藏
      友情链接
      • 订阅本站的 RSS 2.0 新闻聚合
      控制面板
      您好,欢迎到访网站!
        查看权限

      Powered By Z-BlogPHP 1.5.2 Zero Theme By 蜘蛛池

      Copyright Your zhizhu.seo6889.com.Some Rights Reserved.QQ:25496334