最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式之初識行為型模式

 更新時間:2021年06月07日 16:41:44   作者:三笠·阿卡曼  
今天帶大家學習Java設計模式的相關知識點,文中對Java行為型模式做了非常詳細的介紹及代碼示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下

一、行為型模式

  • 行為型模式關注點在于"如何運行對象/類";
  • 行為型模式用來描述程序在運行時復雜的流程控制;
  • 描述多個類或?qū)ο笾g怎樣互相協(xié)作共同完成單個對象都無法單獨完成的任務,設計算法與對象間職責的分配;
  • 行為型模式分為類行為模式和對象行為模式,前者采用繼承機制來在類間分派行為,后者采用組合或聚合在對象間分配行為。

二、模板方法模式

在模板模式中,一個抽象類公開定義了執(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 {

    /**
     * 定義算法:定義好的模板,關鍵性步驟留給子類實現(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();

    }
}

運行結果

在這里插入圖片描述 

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。。。。。");
    }
}

抽象策略類,定義相關策略方法

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)不同可能會導致不同的游戲結果
        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)用,減少對象間混亂的依賴關系,從而使其耦合松散,而且可以獨立地改變他們之間的交互。屬于對象行為模式。

六、觀察者模式

概念:定義對象間的一種一對多依賴關系,使得當一個對象狀態(tài)發(fā)生改變時,其相關依賴對象皆得到通知并被自動更新。觀察者模式又被成為發(fā)布-訂閱模式。
核心:被觀察對象維護觀察對象的引用集合,發(fā)生變化的時候通知每一個觀察對象即可,就拿tiktok的關注主播為例

抽象主播類:

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事件通知機制;
  • 響應式編程;
  • Vue的雙向綁定核心

到此這篇關于Java設計模式之初識行為型模式的文章就介紹到這了,更多相關Java行為型模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文詳解kafka序列化器和攔截器

    一文詳解kafka序列化器和攔截器

    這篇文章主要為大家介紹了kafka序列化器和攔截器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • java一個數(shù)據(jù)整理的方法代碼實例

    java一個數(shù)據(jù)整理的方法代碼實例

    這篇文章主要介紹了java一個數(shù)據(jù)整理的方法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot集成Kafka的實現(xiàn)示例

    SpringBoot集成Kafka的實現(xiàn)示例

    本文主要介紹了SpringBoot集成Kafka的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Java線程間共享與協(xié)作詳細介紹

    Java線程間共享與協(xié)作詳細介紹

    這篇文章主要介紹了Java線程間共享與協(xié)作詳細介紹,Java?支持多個線程同時訪問一個對象或者對象的成員變量,更多相關介紹需要的朋友可以參考一下
    2022-09-09
  • SpringBoot集成JWT實現(xiàn)token驗證的流程

    SpringBoot集成JWT實現(xiàn)token驗證的流程

    Json web token (JWT), 是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC 7519).這篇文章主要介紹了SpringBoot集成JWT實現(xiàn)token驗證,需要的朋友可以參考下
    2020-01-01
  • java無鎖hashmap原理與實現(xiàn)詳解

    java無鎖hashmap原理與實現(xiàn)詳解

    本文主要介紹了java無鎖hashmap原理與實現(xiàn),大家參考使用吧
    2014-01-01
  • springboot實現(xiàn)返回視圖而不是string的方法

    springboot實現(xiàn)返回視圖而不是string的方法

    這篇文章主要介紹了springboot實現(xiàn)返回視圖而不是string的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

    深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

    本篇文章是對Synchronized和java.util.concurrent.locks.Lock的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Java?Unsafe創(chuàng)建對象的方法實現(xiàn)

    Java?Unsafe創(chuàng)建對象的方法實現(xiàn)

    Java中使用Unsafe實例化對象是一項十分有趣而且強大的功能,本文主要介紹了Java?Unsafe創(chuàng)建對象的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Spring Boot Redis客戶端遠程操作實現(xiàn)過程解析

    Spring Boot Redis客戶端遠程操作實現(xiàn)過程解析

    這篇文章主要介紹了Spring Boot Redis客戶端遠程操作實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論

伊吾县| 星子县| 农安县| 清河县| 太仓市| 同江市| 沙坪坝区| 高平市| 麦盖提县| 昂仁县| 广丰县| 莱西市| 揭阳市| 吴旗县| 永昌县| 仲巴县| 瑞昌市| 和硕县| 西宁市| 万年县| 环江| 临桂县| 集安市| 紫金县| 平湖市| 嘉黎县| 四平市| 陆丰市| 西盟| 三门峡市| 珲春市| 舟曲县| 蒙阴县| 区。| 大丰市| 阜康市| 宜阳县| 三原县| 南城县| 湟中县| 出国|