java设计模式-行为型:观察者、责任链、备忘录、命令、状态
yuyutoo 2025-06-23 23:14 3 浏览 0 评论
责任链模式(Chain of Responsibility Pattern)
是行为型设计模式的一种。在责任链模式中,多个处理器都有机会处理请求,但是每个处理器都决定它是否可以处理该请求以及它是否应该将请求传递给链中的下一个处理器。
以下是一个简单的Java实现示例,其中我们创建了一个日志处理系统,其中消息可以被多个处理器处理:
// 抽象处理器
abstract class Handler {
protected Handler nextHandler;
public Handler setNext(Handler nextHandler) {
this.nextHandler = nextHandler;
return nextHandler; // 返回nextHandler以构建链
}
public abstract void handleRequest(String message);
}
// 具体处理器A
class ConcreteHandlerA extends Handler {
public void handleRequest(String message) {
if (message.contains("A")) {
System.out.println("ConcreteHandlerA handled request");
} else {
nextHandler.handleRequest(message);
}
}
}
// 具体处理器B
class ConcreteHandlerB extends Handler {
public void handleRequest(String message) {
if (message.contains("B")) {
System.out.println("ConcreteHandlerB handled request");
} else {
nextHandler.handleRequest(message);
}
}
}
// 使用责任链模式的示例
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setNext(handlerB); // 构建处理器链
handlerA.handleRequest("This is a message with A");
handlerA.handleRequest("This is a message with B");
handlerA.handleRequest("This is a regular message");
}
}
在这个例子中,我们定义了一个Handler抽象类和两个具体的处理器类ConcreteHandlerA和ConcreteHandlerB。
每个处理器都可以决定是否处理请求,如果不处理,它就会将请求传递给链中的下一个处理器。
在main方法中,我们创建了处理器的实例并设置了它们的后继处理器,
然后发送了几个不同的请求来查看责任链的行为。
备忘录(Memento)模式
是软件设计模式中的一种,其目的是保存一个对象的某个状态,以便在该对象以后的某个时间点恢复到这个状态。以下是一个简单的Java实现示例:
// 备忘录角色,用于存储Originator对象的状态
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
// 原发器角色,需要保存状态的对象
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
// 创建备忘录,保存当前状态
public Memento createMemento() {
return new Memento(state);
}
// 恢复备忘录的状态
public void restoreMemento(Memento memento) {
state = memento.getState();
}
}
// 看护人角色,负责保存备忘录对象,不应该对备忘录的内容进行操作和暴露
class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
public class MementoPatternExample {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 改变originator对象的状态
originator.setState("State #1");
System.out.println("Originator initial state: " + originator.getState());
// 创建并保存备忘录
caretaker.setMemento(originator.createMemento());
// 改变originator对象的状态
originator.setState("State #2");
System.out.println("Originator final state: " + originator.getState());
// 恢复原始状态
originator.restoreMemento(caretaker.getMemento());
System.out.println("Originator restored state: " + originator.getState());
}
}
在这个例子中,Originator类是原发器,它有一个状态需要被保存。Memento类是备忘录,用于保存Originator对象的状态。Caretaker类是看护人,负责保存备忘录,但不应该对其进行操作或暴露其内容。
观察者模式
运行这个例子会先输出原始状态,然后输出修改后的状态,最后恢复原始状态并输出恢复后的状态。
// 观察者模式示例:天气主题和观察者
// 观察者接口
interface Observer {
void update(float temp, float humidity, float pressure);
}
// 观察者实现:气象统计站
class WeatherStation implements Observer {
public void update(float temp, float humidity, float pressure) {
System.out.println("气象统计站记录了数据:");
System.out.println("温度:" + temp + " 湿度:" + humidity + " 压力:" + pressure);
}
}
// 主题接口
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
// 主题实现:天气
class Weather implements Subject {
private List<Observer> observers;
private float temp;
private float humidity;
private float pressure;
public Weather() {
observers = new ArrayList<>();
}
public void setMeasurements(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
notifyObservers();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temp, humidity, pressure);
}
}
}
// 使用观察者模式示例
public class ObserverPatternExample {
public static void main(String[] args) {
Weather weather = new Weather();
WeatherStation station = new WeatherStation();
weather.registerObserver(station);
// 设置测量值,通知观察者
weather.setMeasurements(30, 65, 30.4f);
}
}
这个代码示例展示了如何在Java中实现观察者模式。
我们定义了Observer接口和Subject接口,然后分别用WeatherStation和Weather类实现它们。
Weather类作为主题,维护观察者列表,并在测量改变时通知它们。WeatherStation类作为观察者,实现了update方法来接收主题的通知。
最后在main方法中,我们创建了一个Weather实例并注册了一个WeatherStation观察者,然后设置了一些测量数据,观察者接收到通知并打印出数据。
命令模式
是一种行为设计模式,它允许你把请求封装成一个对象,从而可以使用不同的请求、队列或者日志请求、和支持撤销操作。
以下是一个简单的命令模式的Java代码实现:
// 命令接口
interface Command {
void execute();
}
// 接受者类
class Receiver {
public void open() {
System.out.println("Opening the receiver.");
}
public void close() {
System.out.println("Closing the receiver.");
}
}
// 具体命令类
class OpenCommand implements Command {
private Receiver receiver;
public OpenCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.open();
}
}
class CloseCommand implements Command {
private Receiver receiver;
public CloseCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.close();
}
}
// 调用者类
class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void setCommand(Command command) {
this.command = command;
}
public void action() {
command.execute();
}
}
// 测试代码
public class CommandPatternExample {
public static void main(String[] args) {
Receiver receiver = new Receiver();
OpenCommand openCommand = new OpenCommand(receiver);
CloseCommand closeCommand = new CloseCommand(receiver);
Invoker invoker = new Invoker(openCommand);
invoker.action(); // 打开接受者
invoker.setCommand(closeCommand);
invoker.action(); // 关闭接受者
}
}
在这个例子中,Receiver类是接受者,它知道如何执行一个请求。
OpenCommand和CloseCommand类是具体命令,它们实现了Command接口,并将一个请求封装为一个对象。
Invoker类是调用者,它接收命令对象并调用它的execute方法。
最后,在main方法中,我们创建了一个调用者,并给它传递了不同的命令来执行。
状态模式
// 状态接口
public interface State {
void doAction(Context context);
}
// 具体状态A
public class ConcreteStateA implements State {
@Override
public void doAction(Context context) {
// 处理状态A的逻辑
System.out.println("当前状态是状态A");
// 可能会根据某些条件改变状态
context.setState(new ConcreteStateB());
}
}
// 具体状态B
public class ConcreteStateB implements State {
@Override
public void doAction(Context context) {
// 处理状态B的逻辑
System.out.println("当前状态是状态B");
// 可能会根据某些条件改变状态
context.setState(new ConcreteStateA());
}
}
// 环境类
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public void request() {
// 根据当前状态执行动作
state.doAction(this);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建初始状态
State initialState = new ConcreteStateA();
// 创建环境类
Context context = new Context(initialState);
// 请求,将导致状态变化
context.request();
context.request();
context.request();
context.request();
}
}
这个简单的例子展示了状态模式的一个应用。Context类持有一个State对象的引用,并将所有与状态相关的行为委托给这个状态对象。
根据不同的状态,可以改变Context类的行为。这种模式在需要根据对象的不同状态改变其行为时特别有用。
相关推荐
- Java 代理模式详解(java代理类应用场景)
-
1.代理模式代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(realobject)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象...
- 深入解析Java工厂模式及其应用场景
-
Java工厂模式(FactoryPattern)是一种创建型设计模式,它提供了一种创建对象的最佳实践,这种模式提供了一种抽象工厂,通过使用工厂方法来创建对象。工厂方法将对象的创建推迟到子类中,这样就...
- java之数据格式化(java中格式化快捷键)
-
数据格式化概述1、对属性对象的输入/输出进行格式化,从其本质上讲依然属于“类型转换”的范畴。...
- Java之程序中的套路(设计模式的介绍)
-
前言本文主要是给大家简单地介绍一下设计模式的概念,文中会使用通俗易懂的案例,使你更好地学习本章知识点并理解原理,做到有道无术一.什么是设计模式首先我们得知道什么是设计模式。所谓的...
- java文本对比工具源码5(java 文本对比)
-
/***Locatethebestinstanceof'pattern'in'text'near'...
- Java微服务-设计模式系列全套文章-适配器模式(Adapter Pattern)
-
模式动机适配器模式(AdapterPattern)是一种使用频率非常高的结构型模式,如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容而不能一起工作的两个类可以协同工作。适配...
- Java 20 发布,新特性一览:Amber、Loom 和 Panama 项目
-
作者|MichaelRedlich译者|张卫滨...
- Java语法入门004(java语法合集)
-
上篇是java语法入门003,继续学习Java[1]。...
- Java8优雅编码实战:10个技巧让你的代码焕然一新
-
引言:为什么你的Java代码还不够优雅?“代码质量直接决定开发效率与系统稳定性。据Gartner统计,60%的线上故障源于低级编码错误。本文基于10万+行生产代码优化经验,提炼Java8的10大核心...
- Java中常见的设计模式汇总?(java三种常用设计模式和实例)
-
设计模式是一套经过验证的设计方案和最佳实践,这些经验和方案主要就是用来解决软件设计过程中一些特定的问题。设计模式并不是代码本身,而是一种用来解决某种问题的抽象的解决方案,也就是说设计模式是在不同的语言...
- Java字符串拼接3大隐藏陷阱!你的代码为何越优化越慢-附提速代码
-
导语:“某电商平台因一行字符串拼接代码,每秒多消耗1GB内存!本文通过性能压测对比+字节码反编译,揭秘看似简单的字符串操作如何拖垮你的系统。文末附性能检测工具+优化模板,点击关注领取实战方案!”...
- JDK21新特性:Pattern Matching for switch
-
PatternMatchingforswitchJEP441:PatternMatchingforswitch...
- java设计模式-行为型:观察者、责任链、备忘录、命令、状态
-
责任链模式(ChainofResponsibilityPattern)是行为型设计模式的一种。在责任链模式中,多个处理器都有机会处理请求,但是每个处理器都决定它是否可以处理该请求以及它是否应该将...
- Java设计模式之外观模式(外观模式类图)
-
一、外观模式介绍1.1外观模式定义外观模式(FacadePattern),也叫门面模式,外观模式的原始定义是:为子系统中的一组接口提供统一的接口。它定义了一个更高级别的接口,使子系统更易于使用...
- java文本对比工具源码1(java快速对比数据)
-
/**DiffMatchandPatch*Copyright2018Thediff-match-patchAuthors....
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)