您好,登錄后才能下訂單哦!
這篇文章主要介紹Java設(shè)計(jì)模式之行為型模式的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
行為型模式關(guān)注點(diǎn)在于"如何運(yùn)行對(duì)象/類(lèi)";
行為型模式用來(lái)描述程序在運(yùn)行時(shí)復(fù)雜的流程控制;
描述多個(gè)類(lèi)或?qū)ο笾g怎樣互相協(xié)作共同完成單個(gè)對(duì)象都無(wú)法單獨(dú)完成的任務(wù),設(shè)計(jì)算法與對(duì)象間職責(zé)的分配;
行為型模式分為類(lèi)行為模式和對(duì)象行為模式,前者采用繼承機(jī)制來(lái)在類(lèi)間分派行為,后者采用組合或聚合在對(duì)象間分配行為。
在模板模式中,一個(gè)抽象類(lèi)公開(kāi)定義了執(zhí)行它的方法的方式模板。它的子類(lèi)可以按需重寫(xiě)方法實(shí)現(xiàn),但調(diào)用將以抽象類(lèi)中定義的方式進(jìn)行;
以做飯舉例
模板類(lèi)
package com.vleus.design.behavioral.template; /** * @author vleus * @date 2021年06月06日 15:49 */ public abstract class CookieTemplate { /** * 定義算法:定義好的模板,關(guān)鍵性步驟留給子類(lèi)實(shí)現(xiàn) */ public void cook() { //定義算法步驟 heating(); addFood(); addSalt(); stirfry(); end(); } //加熱方法 public void heating() { System.out.println("準(zhǔn)備開(kāi)火。。。"); } //添加食物 public abstract void addFood(); //加鹽 public abstract void addSalt(); //翻炒 public void stirfry() { System.out.println("翻炒中。。。"); } //出鍋 public void end() { System.out.println("出鍋。。。。"); } }
子類(lèi)實(shí)現(xiàn)模板類(lèi)
package com.vleus.design.behavioral.template; /** * @author vleus * @date 2021年06月06日 15:53 */ public class AutoCookMachine extends CookieTemplate{ @Override public void addFood() { System.out.println("放了三根娃娃菜。。。"); } @Override public void addSalt() { System.out.println("放了一勺鹽。。。"); } }
測(cè)試類(lèi)
package com.vleus.design.behavioral.template; /** * @author vleus * @date 2021年06月06日 15:54 */ public class MainTest { public static void main(String[] args) { AutoCookMachine autoCookMachine = new AutoCookMachine(); autoCookMachine.cook(); } }
運(yùn)行結(jié)果
Spring的整個(gè)繼承體系都基本用到模板方法:
BeanFactory:getBean-A-B-C-D;
JdbcTemplate、RedisTemplate都允許再擴(kuò)展
概念:策略(Strategy)模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使得它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶(hù)。屬于對(duì)象行為模式
抽象策略類(lèi)(Strategy);
具體策略(Concrete Strategy);
環(huán)境類(lèi):持有一個(gè)策略類(lèi)的引用,最終給客戶(hù)端調(diào)用;
以RNG的打游戲的策略為例
環(huán)境類(lèi),持有策略引用
package com.vleus.design.behavioral.strategy; /** * @author vleus * @date 2021年06月06日 16:04 */ public class TeamRNG { //抽取游戲策略算法,并進(jìn)行引用 private GameStrategy gameStrategy; public void setGameStrategy(GameStrategy gameStrategy) { this.gameStrategy = gameStrategy; } public void startGame() { System.out.println("全軍出擊。。。"); //使用游戲套路 gameStrategy.warStrategy(); System.out.println("Victory。。。。。"); } }
抽象策略類(lèi),定義相關(guān)策略方法
package com.vleus.design.behavioral.strategy; public interface GameStrategy { //游戲策略方法 void warStrategy(); }
抽象策略類(lèi)的實(shí)現(xiàn)1
package com.vleus.design.behavioral.strategy; /** * @author vleus * @date 2021年06月06日 16:07 */ public class UziStrategy implements GameStrategy{ @Override public void warStrategy() { System.out.println("uzi莽夫式打法獲取勝利。。。。"); } }
抽象策略類(lèi)的實(shí)現(xiàn)2
package com.vleus.design.behavioral.strategy; /** * @author vleus * @date 2021年06月06日 16:07 */ public class SteadyGameStrategy implements GameStrategy{ @Override public void warStrategy() { System.out.println("穩(wěn)健運(yùn)營(yíng),蠶食對(duì)手獲取勝利。。。"); } }
測(cè)試類(lèi)
package com.vleus.design.behavioral.strategy; /** * @author vleus * @date 2021年06月06日 16:08 */ public class MainTest { public static void main(String[] args) { TeamRNG teamRNG = new TeamRNG(); teamRNG.setGameStrategy(new UziStrategy()); teamRNG.startGame(); System.out.println("----------------------"); teamRNG.setGameStrategy(new SteadyGameStrategy()); teamRNG.startGame(); } }
Spring的InstantiationStrategy;
線程池拒絕策略;
概念:狀態(tài)模式,對(duì)有狀態(tài)的對(duì)象,把負(fù)責(zé)的"判斷邏輯"提取到不同的狀態(tài)對(duì)象中,允許狀態(tài)對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變的時(shí)候改變其行為;
環(huán)境類(lèi)角色;
抽象狀態(tài)角色;
具體狀態(tài)角色
抽象狀態(tài)類(lèi)
package com.vleus.design.behavioral.state; public interface TeamState { //玩游戲的狀態(tài) void playGame(); //切換到下一個(gè)狀態(tài) TeamState next(); }
狀態(tài)實(shí)現(xiàn)類(lèi)1
package com.vleus.design.behavioral.state; /** * @author vleus * @date 2021年06月06日 16:19 */ public class VocationState implements TeamState{ @Override public void playGame() { System.out.println("在三亞度假,真舒服,不想打游戲。。。"); } //切換到下一個(gè)狀態(tài) @Override public TeamState next() { return new EatBeefNoodlesState(); } }
狀態(tài)實(shí)現(xiàn)類(lèi)2
package com.vleus.design.behavioral.state; /** * @author vleus * @date 2021年06月06日 16:20 */ public class EatBeefNoodlesState implements TeamState{ @Override public void playGame() { System.out.println("恰牛肉面恰飽飽。。。。"); } @Override public TeamState next() { return new MatchState(); } }
狀態(tài)實(shí)現(xiàn)類(lèi)3
package com.vleus.design.behavioral.state; /** * @author vleus * @date 2021年06月06日 16:18 */ public class MatchState implements TeamState{ @Override public void playGame() { System.out.println("全力以赴打比賽..."); } @Override public TeamState next() { return new VocationState(); } }
環(huán)境類(lèi)調(diào)用
package com.vleus.design.behavioral.state; /** * @author vleus * @date 2021年06月06日 16:17 * @desc 環(huán)境類(lèi) */ public class SktTeam { private TeamState teamState; public void setTeamState(TeamState teamState) { this.teamState = teamState; } void startGame() { //狀態(tài)不同可能會(huì)導(dǎo)致不同的游戲結(jié)果 teamState.playGame(); } //下一個(gè)狀態(tài) void nextState() { teamState = teamState.next(); } }
測(cè)試類(lèi)
package com.vleus.design.behavioral.state; /** * @author vleus * @date 2021年06月06日 16:20 */ public class MainTest { public static void main(String[] args) { SktTeam sktTeam = new SktTeam(); VocationState state = new VocationState(); sktTeam.setTeamState(state); sktTeam.startGame(); sktTeam.nextState(); sktTeam.startGame(); sktTeam.nextState(); sktTeam.startGame(); } }
網(wǎng)狀變星狀
概念:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互,中介者使得各個(gè)對(duì)象之間不需要顯式地互相調(diào)用,減少對(duì)象間混亂的依賴(lài)關(guān)系,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互。屬于對(duì)象行為模式。
概念:定義對(duì)象間的一種一對(duì)多依賴(lài)關(guān)系,使得當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴(lài)對(duì)象皆得到通知并被自動(dòng)更新。觀察者模式又被成為發(fā)布-訂閱模式。
核心:被觀察對(duì)象維護(hù)觀察對(duì)象的引用集合,發(fā)生變化的時(shí)候通知每一個(gè)觀察對(duì)象即可,就拿tiktok的關(guān)注主播為例
抽象主播類(lèi):
package com.vleus.design.behavioral.observer; /** * @author vleus * @date 2021年06月06日 17:50 */ public abstract class AbstractTikToker { //添加粉絲 abstract void addFans(AbstractFans abstractFans); //通知粉絲 abstract void notifyFans(String msg); }
美女主播實(shí)現(xiàn)類(lèi)
package com.vleus.design.behavioral.observer; import com.vleus.design.structural.flyweight.AbstractWaitressFlyweight; import java.util.ArrayList; import java.util.List; /** * @author vleus * @date 2021年06月06日 17:52 */ public class MMTikToker extends AbstractTikToker { List<AbstractFans> fansList = new ArrayList<>(); void startSell() { System.out.println("主播開(kāi)始賣(mài)貨了。。。"); notifyFans("我開(kāi)始賣(mài)貨了,賣(mài)茅臺(tái)。。。"); } void enbSell() { System.out.println("主播貨賣(mài)完了。。。"); notifyFans("茅臺(tái)已經(jīng)賣(mài)完了"); } @Override void addFans(AbstractFans abstractFans) { fansList.add(abstractFans); } /** * 通知粉絲 */ @Override void notifyFans(String msg) { //遍歷粉絲 for (AbstractFans abstractFans : fansList) { abstractFans.acceptMsg(msg); } } }
抽象粉絲類(lèi)
package com.vleus.design.behavioral.observer; /** * @author vleus * @date 2021年06月06日 17:52 */ public abstract class AbstractFans { abstract void acceptMsg(String msg); void follow(AbstractTikToker tikToker) { //主播增加粉絲 tikToker.addFans(this); } }
粉絲實(shí)現(xiàn)類(lèi)
package com.vleus.design.behavioral.observer; /** * @author vleus * @date 2021年06月06日 17:57 */ public class HumanFans extends AbstractFans{ @Override void acceptMsg(String msg) { System.out.println("粉絲說(shuō)主播說(shuō):" +msg); } }
測(cè)試類(lèi)
package com.vleus.design.behavioral.observer; /** * @author vleus * @date 2021年06月06日 17:56 */ public class MainTest { public static void main(String[] args) { MMTikToker mmTikToker = new MMTikToker(); mmTikToker.startSell(); HumanFans humanFans1 = new HumanFans(); HumanFans humanFans2 = new HumanFans(); HumanFans humanFans3 = new HumanFans(); humanFans1.follow(mmTikToker); humanFans2.follow(mmTikToker); humanFans3.follow(mmTikToker); System.out.println("---------------------------"); mmTikToker.enbSell(); } }
Spring事件通知機(jī)制;
響應(yīng)式編程;
Vue的雙向綁定核心
以上是“Java設(shè)計(jì)模式之行為型模式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。