Java設(shè)計模式之初識行為型模式
一、行為型模式
- 行為型模式關(guān)注點在于"如何運行對象/類";
- 行為型模式用來描述程序在運行時復(fù)雜的流程控制;
- 描述多個類或?qū)ο笾g怎樣互相協(xié)作共同完成單個對象都無法單獨完成的任務(wù),設(shè)計算法與對象間職責的分配;
- 行為型模式分為類行為模式和對象行為模式,前者采用繼承機制來在類間分派行為,后者采用組合或聚合在對象間分配行為。
二、模板方法模式
在模板模式中,一個抽象類公開定義了執(zhí)行它的方法的方式模板。它的子類可以按需重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行;
2.1 例子
以做飯舉例
模板類
package com.vleus.design.behavioral.template;
/**
* @author vleus
* @date 2021年06月06日 15:49
*/
public abstract class CookieTemplate {
/**
* 定義算法:定義好的模板,關(guān)鍵性步驟留給子類實現(xiàn)
*/
public void cook() {
//定義算法步驟
heating();
addFood();
addSalt();
stirfry();
end();
}
//加熱方法
public void heating() {
System.out.println("準備開火。。。");
}
//添加食物
public abstract void addFood();
//加鹽
public abstract void addSalt();
//翻炒
public void stirfry() {
System.out.println("翻炒中。。。");
}
//出鍋
public void end() {
System.out.println("出鍋。。。。");
}
}
子類實現(xiàn)模板類
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("放了一勺鹽。。。");
}
}
測試類
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();
}
}
運行結(jié)果
2.2 模板方法使用場景
- Spring的整個繼承體系都基本用到模板方法:
- BeanFactory:getBean-A-B-C-D;
- JdbcTemplate、RedisTemplate都允許再擴展
三、策略模式
概念:策略(Strategy)模式定義了一系列算法,并將每個算法封裝起來,使得它們可以相互替換,且算法的變化不會影響使用算法的客戶。屬于對象行為模式
- 抽象策略類(Strategy);
- 具體策略(Concrete Strategy);
- 環(huán)境類:持有一個策略類的引用,最終給客戶端調(diào)用;
3.1 例子
以RNG的打游戲的策略為例
環(huán)境類,持有策略引用
package com.vleus.design.behavioral.strategy;
/**
* @author vleus
* @date 2021年06月06日 16:04
*/
public class TeamRNG {
//抽取游戲策略算法,并進行引用
private GameStrategy gameStrategy;
public void setGameStrategy(GameStrategy gameStrategy) {
this.gameStrategy = gameStrategy;
}
public void startGame() {
System.out.println("全軍出擊。。。");
//使用游戲套路
gameStrategy.warStrategy();
System.out.println("Victory。。。。。");
}
}
抽象策略類,定義相關(guān)策略方法
package com.vleus.design.behavioral.strategy;
public interface GameStrategy {
//游戲策略方法
void warStrategy();
}
抽象策略類的實現(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莽夫式打法獲取勝利。。。。");
}
}
抽象策略類的實現(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)健運營,蠶食對手獲取勝利。。。");
}
}
測試類
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();
}
}
3.2 使用場景
- Spring的InstantiationStrategy;
- 線程池拒絕策略;
四、狀態(tài)模式
概念:狀態(tài)模式,對有狀態(tài)的對象,把負責的"判斷邏輯"提取到不同的狀態(tài)對象中,允許狀態(tài)對象在其內(nèi)部狀態(tài)發(fā)生改變的時候改變其行為;
- 環(huán)境類角色;
- 抽象狀態(tài)角色;
- 具體狀態(tài)角色
抽象狀態(tài)類
package com.vleus.design.behavioral.state;
public interface TeamState {
//玩游戲的狀態(tài)
void playGame();
//切換到下一個狀態(tài)
TeamState next();
}
狀態(tài)實現(xiàn)類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("在三亞度假,真舒服,不想打游戲。。。");
}
//切換到下一個狀態(tài)
@Override
public TeamState next() {
return new EatBeefNoodlesState();
}
}
狀態(tài)實現(xiàn)類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)實現(xiàn)類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)境類調(diào)用
package com.vleus.design.behavioral.state;
/**
* @author vleus
* @date 2021年06月06日 16:17
* @desc 環(huán)境類
*/
public class SktTeam {
private TeamState teamState;
public void setTeamState(TeamState teamState) {
this.teamState = teamState;
}
void startGame() {
//狀態(tài)不同可能會導(dǎo)致不同的游戲結(jié)果
teamState.playGame();
}
//下一個狀態(tài)
void nextState() {
teamState = teamState.next();
}
}
測試類
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)狀變星狀

概念:用一個中介對象來封裝一系列的對象交互,中介者使得各個對象之間不需要顯式地互相調(diào)用,減少對象間混亂的依賴關(guān)系,從而使其耦合松散,而且可以獨立地改變他們之間的交互。屬于對象行為模式。
六、觀察者模式
概念:定義對象間的一種一對多依賴關(guān)系,使得當一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新。觀察者模式又被成為發(fā)布-訂閱模式。
核心:被觀察對象維護觀察對象的引用集合,發(fā)生變化的時候通知每一個觀察對象即可,就拿tiktok的關(guān)注主播為例
抽象主播類:
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);
}
美女主播實現(xiàn)類
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("主播開始賣貨了。。。");
notifyFans("我開始賣貨了,賣茅臺。。。");
}
void enbSell() {
System.out.println("主播貨賣完了。。。");
notifyFans("茅臺已經(jīng)賣完了");
}
@Override
void addFans(AbstractFans abstractFans) {
fansList.add(abstractFans);
}
/**
* 通知粉絲
*/
@Override
void notifyFans(String msg) {
//遍歷粉絲
for (AbstractFans abstractFans : fansList) {
abstractFans.acceptMsg(msg);
}
}
}
抽象粉絲類
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);
}
}
粉絲實現(xiàn)類
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("粉絲說主播說:" +msg);
}
}
測試類
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();
}
}
6.1 使用場景
- Spring事件通知機制;
- 響應(yīng)式編程;
- Vue的雙向綁定核心
到此這篇關(guān)于Java設(shè)計模式之初識行為型模式的文章就介紹到這了,更多相關(guān)Java行為型模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán)示例源碼
這篇文章主要介紹了Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán),本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
如何使用Gradle實現(xiàn)類似Maven的profiles功能
這篇文章主要介紹了如何使用Gradle實現(xiàn)類似Maven的profiles功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-06-06

