Java设计模式 十四 行为型模式 (Behavioral Patterns)

behavior.zip 行为型设计模式 模板方法模式代码示例 策略模式代码示例 观察者模式代码示例 责任链模式代码示例 命令模式代码示例 立即下载

行为型模式 (Behavioral Patterns)

行为型设计模式关注于对象之间的通信和职责分配,主要用来优化对象之间的交互和提高系统的灵活性。这些模式帮助我们在程序中实现对象之间的责任链、请求传递、行为协作等。行为型模式通常描述了对象之间如何通过消息传递来完成某项任务。

以下是一些常见的行为型设计模式:


1. 策略模式 (Strategy Pattern)

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法的变化独立于使用算法的客户端。

  • 意图: 定义一系列算法,将每个算法封装成一个类,且使它们可以互换。
  • 应用场景: 需要在多个算法之间进行选择,或者某个类的行为需要在运行时动态切换。

示例:

// 策略接口
public interface Strategy {
    void execute();
}

// 具体策略1
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Strategy A");
    }
}

// 具体策略2
public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Strategy B");
    }
}

// 上下文类
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Strategy strategyA = new ConcreteStrategyA();
        Strategy strategyB = new ConcreteStrategyB();
        
        Context context = new Context(strategyA);
        context.executeStrategy();  // 输出 Strategy A
        
        context = new Context(strategyB);
        context.executeStrategy();  // 输出 Strategy B
    }
}

2. 观察者模式 (Observer Pattern)

观察者模式定义了一种一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。通常用于事件处理系统或订阅/发布模式。

  • 意图: 当一个对象的状态变化时,自动通知并更新所有依赖于它的对象。
  • 应用场景: 当一个对象的变化需要影响其他对象,且不知道有多少对象需要被更新时。

示例:

// 观察者接口
public interface Observer {
    void update(String message);
}

// 具体观察者1
public class ConcreteObserverA implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Observer A received message: " + message);
    }
}

// 具体观察者2
public class ConcreteObserverB implements Observer {
    @Override
    public void update(String message) {
        System.out.println("Observer B received message: " + message);
    }
}

// 被观察者(主题)接口
public interface Subject {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体被观察者
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }

    // 状态变化
    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        Observer observerA = new ConcreteObserverA();
        Observer observerB = new ConcreteObserverB();
        
        subject.addObserver(observerA);
        subject.addObserver(observerB);
        
        subject.setState("New State");  // Observer A and B will be notified
    }
}

3. 责任链模式 (Chain of Responsibility Pattern)

责任链模式通过将请求传递给链中的每个对象,直到有对象处理它。责任链模式让多个对象有机会处理请求,从而避免了请求发送者与接受者之间的耦合。

  • 意图: 让多个对象都有机会处理请求,将请求的处理责任链式传递下去,直到某个对象处理它。
  • 应用场景: 需要将请求分配给多个处理者时,或者某个请求由多个处理者依次处理的场景。

示例:

// 处理者抽象类
public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(String request);
}

// 具体处理者1
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("A")) {
            System.out.println("Handler A handles the request");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者2
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("B")) {
            System.out.println("Handler B handles the request");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        
        handlerA.setNextHandler(handlerB);
        
        handlerA.handleRequest("B");  // Handler B handles the request
    }
}

4. 命令模式 (Command Pattern)

命令模式将请求封装成对象,从而使我们可以将请求的调用者和请求的接收者解耦。命令模式允许用户将请求的执行操作参数化,使得请求者可以异步执行请求、排队请求、记录请求历史等。

  • 意图: 将请求封装成一个对象,使得请求发送者和接收者解耦。
  • 应用场景: 需要将请求的发送者与接收者解耦,或者需要将请求存储、撤销等操作。

示例:

// 命令接口
public interface Command {
    void execute();
}

// 具体命令1
public class ConcreteCommandA implements Command {
    private Receiver receiver;

    public ConcreteCommandA(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }
}

// 接收者类
public class Receiver {
    public void action() {
        System.out.println("Receiver is performing an action");
    }
}

// 调用者类
public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void invoke() {
        command.execute();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommandA(receiver);
        Invoker invoker = new Invoker();
        
        invoker.setCommand(command);
        invoker.invoke();  // Output: Receiver is performing an action
    }
}

5. 状态模式 (State Pattern)

状态模式允许一个对象在其内部状态改变时,改变其行为。对象看起来好像修改了其类。状态模式通常用于处理有多个状态、且根据不同状态来执行不同行为的场景。

  • 意图: 允许对象在状态改变时,改变其行为。
  • 应用场景: 对象的行为依赖于其状态,且该状态会在运行时改变。

示例:

// 状态接口
public interface State {
    void handleRequest();
}

// 具体状态1
public class ConcreteStateA implements State {
    @Override
    public void handleRequest() {
        System.out.println("State A is handling the request");
    }
}

// 具体状态2
public class ConcreteStateB implements State {
    @Override
    public void handleRequest() {
        System.out.println("State B is handling the request");
    }
}

// 上下文类
public class Context {
    private State state;

    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        state.handleRequest();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        
        State stateA = new ConcreteStateA();
        context.setState(stateA);
        context.request();  // Output: State A is handling the request
        
        State stateB = new ConcreteStateB();
        context.setState(stateB);
        context.request();  // Output: State B is handling the request
    }
}

6. 总结

行为型设计模式主要关注于对象之间的交互和责任分配。

RxJava之BehaviorSubject使用 RxJava中BehaviorSubject适合的使用场景代码 立即下载

相关推荐

微前端实战:MicroApp内存泄漏优化策略与性能调优

本文分享了在大型后台管理系统微前端化过程中,使用MicroApp框架时遇到的内存泄漏实战问题与优化策略。通过深入分析沙箱机制,提出动态加载、精准卸载、沙箱配置优化及第三方库补丁等核心方案,并结合Vue/React子应用专项检查清单,有效解决了内存占用飙升问题,为微前端架构的性能调优提供了系统性解决方案。

weixin_29014939的博客 277

【设计模式】 - 行为型模式(Behavioral Patterns)

行为型设计模式是一组用于处理对象之间通信和协作的设计模式。它们解决了不同对象之间的关系和职责分配问题,使得系统更加灵活和可扩展。

记录了,但是完全不会。 744

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程

本文为GNSS新手提供RTKLIB命令行程序实战指南,重点介绍如何通过`rnx2rtkp`后处理解算工具快速掌握GNSS解算全流程。从环境搭建、程序编译到核心算法解析,帮助读者理解RTKLIB源码结构,并通过真实数据处理案例演示完整解算过程,是入门GNSS定位技术的实用教程。

weixin_42524226的博客 359

Java快速入门(2) - 基本语法

Java中的基本语法,包括标识符、变量、数组、枚举、继承和接口等等。

355

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的全过程。针对数据不满足正态性和方差齐性假设时,如何通过秩转换、回归调整残差,并最终利用Kruskal-Wallis检验完成组间比较。该方法为处理含协变量的非参数多组比较问题提供了清晰的实战解决方案,并探讨了其与标准Quade检验的异同及适用场景。

weixin_29306317的博客 356

Unity类银河战士恶魔城学习总结(P162 Improve skeleton提升敌人的效果)

为敌人添加了快慢刀

suzh1qian的博客 572

java behavior_java继承的几个特性

1.基类中的方法使用private修饰,就代表该方法仅属于该类,不会被子类继承,调用和重写。2.基类方法使用final修饰代表此方法不会被子类所重写。3.使用@Override注解表示重写父类方法,来区分重载父类方法。4.父类中的变量通常设为private,操作变量的方法设为protected,以此来控制变量的访问权限问题。5.向上转型class Amphibian {public void sa...

weixin_36217920的博客 320

csp-j/s

CSP-J/S 是中国计算机学会(CCF)主办的 ‌‌(Certified Software Professional Junior/Senior),是信息学奥赛(NOI)体系的入门级选拔考试,也是国内最具权威性的青少年编程能力认证之一。

gxyxxrYYDS的博客 2028

探索Behavior3Java:一款强大的行为树库

探索Behavior3Java:一款强大的行为树库 如果你在寻找一个高效、灵活且易于理解的行为树库来为你的AI系统添加复杂的决策逻辑,那么Behavior3Java可能正是你需要的解决方案。这是一个由SilenceSu开发并维护的开源项目,它实现了基于行为树(Behavior Tree)的框架,适用于游戏开发、机器人控制、对话系统等多种场景。 项目简介 Behavior3Java是行为树库的一个J...

gitblog_00012的博客 1092

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2623

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

java state behavior_深入理解CoordinatorLayout.Behavior

Behavior要研究的几个问题一、Behavior是什么?为什么要用Behavior?二、怎么使用Behavior?三、从源码角度看为什么要这么使用Behavior?一、Behavior是什么?为什么要用Behavior?CoordinatorLayout是android support design推出的新布局,主要用于作为视图根布局以及协调子控件的行为,而Behavior就是用于直接子控件来...

weixin_42549451的博客 233

Arduino ESP32 Web服务器从microSD卡读取

Arduino ESP32 Web服务器从microSD卡读取 将网页内容放到SD卡中,当有客户端数据请求时,从SD卡读取信息进行发送,比起SPIFFS文件系统,更节约板上的硬件资源。 SD卡接线说明 ESP32----- SD D5(GPIO 5)-----CS D18(GPIO 18)-----SCK D19(GPIO 19)-----MISO D23()GPIO 23-----MOSI 文件放置 需要把文件放置到SD卡的根目录下。注意SD卡的格式FAT32格式。 实例代码 /*

perseverance51博客 1433

设计模式专栏( 四):行为型设计模式(Behavioral Design Patterns)

请求发送者与接收者解耦增加或调整处理者顺序灵活请求可能一直传递而没有被处理调试链路时不易追踪解耦请求发送者与执行者易于扩展新命令支持撤销、重做、日志等功能增加了类的数量易于实现简单文法的解析扩展文法方便对于复杂文法会导致类爆炸解释效率低遍历不暴露内部结构可为不同集合结构提供统一访问接口对简单遍历可能显得多余降低对象之间的耦合便于维护对象交互逻辑中介者可能变成“上帝类”,逻辑过多导致复杂度高提供了状态的保存与恢复机制封装了内部状态,保护数据安全。

745

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

行为型模式(Behavioral Patterns)

行为型模式demo

一个有兴趣的程序员男孩 290

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【设计模式】【行为型模式(Behavioral Patterns)】之策略模式(Strategy Pattern)

策略模式是一种行为设计模式,它允许你定义一系列算法,并将每个算法封装起来,使它们可以互换。这种模式的主要目的是在不改变客户端代码的情况下,通过不同的策略来实现不同的行为。

ido1ok的博客 923

【设计模式】【行为型模式(Behavioral Patterns)】之访问者模式(Visitor Pattern)

访问者模式是一种行为设计模式,它允许您在不修改现有元素类层次结构的情况下向其添加新的操作。这种模式通过将算法从对象结构中分离出来,使得添加新的操作变得容易,同时保持了原有的对象结构不变。

ido1ok的博客 1051

【设计模式】【行为型模式(Behavioral Patterns)】之状态模式(State Pattern)

状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。这个模式的核心思想是使用不同的类来表示不同的状态,每个状态类都封装了与该状态相关的特定行为。当对象的状态发生改变时,对象会切换到另一个状态对象,从而改变了它的行为。

ido1ok的博客 823

【设计模式】【行为型模式(Behavioral Patterns)】之命令模式(Command Pattern)

命令模式是一种行为设计模式,它将请求封装成对象,从而使你可以用不同的请求对客户进行参数化、队列请求或将请求日志化,同时支持可撤销的操作。通过这种方式,可以将请求发送者与接收者解耦,使得两者之间不再直接联系,而是通过命令对象进行交互。

ido1ok的博客 774

【设计模式】【行为型模式(Behavioral Patterns)】之观察者模式(Observer Pattern)

观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式特别适用于事件驱动系统,其中对象之间需要保持同步但又不想紧密耦合。

ido1ok的博客 904

【设计模式】【行为型模式(Behavioral Patterns)】之中介者模式(Mediator Pattern)

中介者模式是一种行为设计模式,它使用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

ido1ok的博客 505

【设计模式】【行为型模式(Behavioral Patterns)】之迭代器模式(Iterator Pattern)

迭代器模式是一种行为设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。通过将数据的遍历逻辑与数据结构分离,迭代器模式使得同一个遍历逻辑可以应用于不同的数据结构,同时隐藏了数据结构的内部细节。

ido1ok的博客 494

【设计模式】【行为型模式(Behavioral Patterns)】之责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。每个处理者都可以处理请求,或者将其传递给链上的下一个处理者。这种模式使得多个对象都有机会处理请求,而无需提前指定具体的处理者。通过这种方式,可以减少请求发送者和接收者之间的耦合。

ido1ok的博客 864

go-patterns状态模式深度解析:如何在Go中优雅实现状态机,避免嵌套switch

**go-patterns** 是一个收录了 22 种经典设计模式的 Go 语言开源示例库,覆盖创建型、结构型和行为型三大类。其中行为型包中的**状态模式(State Pattern)**示例,演示了如何用接口和状态对象代替层层嵌套的 switch,优雅地实现 Go 状态机。本文带你读懂它的实现原理,并掌握在订单、连接、工作流等场景中落地状态模式的方法。 [![Go设计模式状态模式示例Gophe

gitblog_01026的博客 695

java设计模式实例_java-design-patterns

Design patterns implemented in JavaIntroductionDesign patterns are formalized best practices that the programmer can use tosolve common problems when designing an application or system.Design patterns...

weixin_33716616的博客 218
上一篇: Java设计模式 十三 代理模式 (Proxy Pattern)
下一篇: Java设计模式 十七 命令模式 (Command Pattern)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8359粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值