java设计模式:04-行为型模式-概览

行为型模式(Behavioral Patterns)

行为型模式(Behavioral Patterns)主要关注对象之间的通信和职责分配,旨在通过对象之间的相互作用来实现特定的功能。行为型模式不仅关注类和对象的结构,还关注它们之间的协作。通过使用行为型模式,可以提高系统的灵活性和可维护性,减少对象之间的耦合。

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

定义:将请求沿着处理链传递,直到有一个对象处理它。
详细释义:责任链模式通过将请求沿着处理链传递,直到有一个对象处理它。每个对象都包含对下一个对象的引用,从而形成一条链。请求从链的一端开始,沿着链传递,直到有一个对象处理它或到达链的末端。

public abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}public class ConcreteHandler1 extends Handler {public void handleRequest(int request) {if (request < 10) {System.out.println("ConcreteHandler1 handled request: " + request);} else if (successor != null) {successor.handleRequest(request);}}
}public class ConcreteHandler2 extends Handler {public void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("ConcreteHandler2 handled request: " + request);} else if (successor != null) {successor.handleRequest(request);}}
}

2. 命令模式 (Command Pattern)

定义:将请求封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。
详细释义:命令模式通过将请求封装成对象,使得你可以使用不同的请求、队列或日志来参数化其他对象。每个命令对象都实现一个统一的接口,包含执行请求的所有信息。这样可以在不修改调用者代码的情况下更改请求的执行方式。

public interface Command {void execute();
}public class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}public void execute() {receiver.action();}
}public class Receiver {public void action() {System.out.println("Receiver action");}
}public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}
}

3. 解释器模式 (Interpreter Pattern)

定义:给定一个语言,定义其文法的一种表示,并提供一个解释器来处理语言中的句子。
详细释义:解释器模式用于定义一个语言的文法表示,并提供一个解释器来处理这些表示。通常用于实现简单的语法解析器,如正则表达式引擎、计算器等。解释器模式适用于那些频繁出现的、可以用简单语法规则定义的领域。

public interface Expression {boolean interpret(String context);
}public class TerminalExpression implements Expression {private String data;public TerminalExpression(String data) {this.data = data;}public boolean interpret(String context) {return context.contains(data);}
}public class OrExpression implements Expression {private Expression expr1;private Expression expr2;public OrExpression(Expression expr1, Expression expr2) {this.expr1 = expr1;this.expr2 = expr2;}public boolean interpret(String context) {return expr1.interpret(context) || expr2.interpret(context);}
}

4. 迭代器模式 (Iterator Pattern)

定义:提供一种方法顺序访问聚合对象中的各个元素,而不暴露其内部表示。
详细释义:迭代器模式通过提供一种方法顺序访问聚合对象中的各个元素,而不暴露其内部表示。迭代器模式使得你可以遍历一个集合对象的元素而不需要了解其底层实现。迭代器通常包含两个核心方法:hasNext()next()

public interface Iterator {boolean hasNext();Object next();
}public interface Container {Iterator getIterator();
}public class NameRepository implements Container {public String[] names = {"John", "Jane", "Doe"};public Iterator getIterator() {return new NameIterator();}private class NameIterator implements Iterator {int index;public boolean hasNext() {return index < names.length;}public Object next() {if (this.hasNext()) {return names[index++];}return null;}}
}

5. 中介者模式 (Mediator Pattern)

定义:用一个中介对象来封装一系列对象之间的交互,使得这些对象之间不需要显式地相互引用。
详细释义:中介者模式通过使用一个中介对象来封装一系列对象之间的交互,使得这些对象之间不需要显式地相互引用。这种模式通过减少对象之间的直接依赖,降低了系统的耦合度,增加了系统的灵活性。

public interface Mediator {void sendMessage(String message, Colleague colleague);
}public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}public class ConcreteMediator implements Mediator {private Colleague1 colleague1;private Colleague2 colleague2;public void setColleague1(Colleague1 colleague1) {this.colleague1 = colleague1;}public void setColleague2(Colleague2 colleague2) {this.colleague2 = colleague2;}public void sendMessage(String message, Colleague colleague) {if (colleague == colleague1) {colleague2.notify(message);} else {colleague1.notify(message);}}
}public class Colleague1 extends Colleague {public Colleague1(Mediator mediator) {super(mediator);}public void send(String message) {mediator.sendMessage(message, this);}public void notify(String message) {System.out.println("Colleague1 got message: " + message);}
}public class Colleague2 extends Colleague {public Colleague2(Mediator mediator) {super(mediator);}public void send(String message) {mediator.sendMessage(message, this);}public void notify(String message) {System.out.println("Colleague2 got message: " + message);}
}

6. 备忘录模式 (Memento Pattern)

定义:在不破坏封装性的前提下,捕获并保存对象的内部状态,以便可以在以后恢复。
详细释义:备忘录模式通过在不破坏封装性的前提下,捕获并保存对象的内部状态,以便在以后恢复。备忘录模式通常用于实现撤销操作,通过保存对象的状态,可以在需要时将对象恢复到之前的状态。

public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}public class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveStateToMemento() {return new Memento(state);}public void getStateFromMemento(Memento memento) {state = memento.getState();}
}public class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void add(Memento state) {mementoList.add(state);}public Memento get(int index) {return mementoList.get(index);}
}

7. 观察者模式 (Observer Pattern)

定义:定义对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,其相关依赖对象皆得到通知并被自动更新。
详细释义:观察者模式定义对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,其相关依赖对象皆得到通知并被自动更新。这种模式通常用于实现事件处理系统,如GUI事件模型。

public interface Observer {void update(String state);
}public class ConcreteObserver implements Observer {private String observerState;public void update(String state) {observerState = state;System.out.println("Observer state updated: " + observerState);}
}public interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers();
}public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String state;public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update(state);}}public void setState(String state) {this.state = state;notifyObservers();}public String getState() {return state;}
}

8. 状态模式 (State Pattern)

定义:允许对象在其内部状态改变时改变其行为,对象看起来好像修改了其类。
详细释义:状态模式通过将状态相关的行为封装到不同的状态对象中,使得对象在其内部状态改变时可以改变其行为。状态模式通过状态对象实现状态之间的转换,使得对象的行为随状态改变而改变。

public interface State {void doAction(Context context);
}public class ConcreteStateA implements State {public void doAction(Context context) {System.out.println("State A action");context.setState(this);}
}public class ConcreteStateB implements State {public void doAction(Context context) {System.out.println("State B action");context.setState(this);}
}public class Context {private State state;public Context() {state = null;}public void setState(State state) {this.state = state;}public State getState() {return state;}public void doAction() {state.doAction(this);}
}

9. 策略模式 (Strategy Pattern)

定义:定义一系列算法,将每个算法封装起来,并让它们可以互相替换。
详细释义:策略模式定义一系列算法,将每个算法封装起来,并让它们可以互相替换。策略模式使得算法可以独立于使用它的客户而变化。通常用于实现多种算法或行为的选择,例如排序算法、压缩算法等。

public interface Strategy {int doOperation(int num1, int num2);
}public class OperationAdd implements Strategy {public int doOperation(int num1, int num2) {return num1 + num2;}
}public class OperationSubtract implements Strategy {public int doOperation(int num1, int num2) {return num1 - num2;}
}public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}

10. 模板方法模式 (Template Method Pattern)

定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法结构地重定义该算法的某些特定步骤。
详细释义:模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。模板方法模式常用于定义操作的标准步骤,并允许子类根据具体需求实现这些步骤。

public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法public final void play() {initialize();startPlay();endPlay();}
}public class Cricket extends Game {void initialize() {System.out.println("Cricket Game Initialized");}void startPlay() {System.out.println("Cricket Game Started");}void endPlay() {System.out.println("Cricket Game Ended");}
}public class Football extends Game {void initialize() {System.out.println("Football Game Initialized");}void startPlay() {System.out.println("Football Game Started");}void endPlay() {System.out.println("Football Game Ended");}
}

11. 访问者模式 (Visitor Pattern)

定义:表示一个作用于某对象结构中的各元素的操作,使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
详细释义:访问者模式通过将操作分离到访问者对象中,使得你可以在不改变元素类的前提下为这些元素定义新的操作。访问者模式通常用于对象结构较为复杂、需要对其元素进行多种不同操作的情况。

public interface Visitor {void visit(ConcreteElementA elementA);void visit(ConcreteElementB elementB);
}public class ConcreteVisitor implements Visitor {public void visit(ConcreteElementA elementA) {System.out.println("Visiting ConcreteElementA");}public void visit(ConcreteElementB elementB) {System.out.println("Visiting ConcreteElementB");}
}public interface Element {void accept(Visitor visitor);
}public class ConcreteElementA implements Element {public void accept(Visitor visitor) {visitor.visit(this);}
}public class ConcreteElementB implements Element {public void accept(Visitor visitor) {visitor.visit(this);}
}

通过这些行为型模式,开发者可以更好地处理对象之间的通信和职责分配,增强系统的灵活性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt绘制指南针(仪表盘绘制封装使用)

指南针是一种用来确定方向的工具。它由一个磁针制成&#xff0c;其一端被磁化&#xff0c;可以自由旋转。当放置在水平面上时&#xff0c;磁针会指向地球的磁北极。通过观察磁针的指向&#xff0c;我们可以确定地理北方的方向。本示例是在Qt中绘制一个指南针&#xff0c;通过继…

Android WebViewClient 的 `shouldOverrideUrlLoading` 方法

简介 在Android开发中&#xff0c;WebView是一个强大的工具&#xff0c;可以在你的应用中显示网页内容。了解 WebViewClient 中的 shouldOverrideUrlLoading 方法是至关重要的&#xff0c;因为这个方法允许你控制 URL 在 WebView 中的处理方式。 在本文中&#xff0c;我们将详…

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频&#xff0c;从入门开始讲解_哔哩哔哩_bilibili

Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)

上次结束了进程间通信的知识介绍&#xff1a;Linux&#xff1a;进程间通信&#xff08;二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量 文章目录 1.认识信号进程看待信号方式 2.信号的产生2.1信号的处理的方式 --- signal()函数2.2kill指令产生信号2.3键盘产生…

最新快乐二级域名分发系统重置版v1.7源码-最新美化版+源码+可对接支付

源码简介&#xff1a; 最新快乐二级域名分发系统重置版v1.7源码&#xff0c;它是最新美化版源码可对接支付。 快乐二级域名分发系统重置版v1.7源码&#xff0c;简单快捷、功能强大的控制面板。系统稳定长久&#xff0c;控制面板没任何广告&#xff0c;让网站更实用方便。 最…

SeleniumBasic操作运行中的Chrome浏览器

今天用免费云服务器&#xff0c;三丰云&#xff0c;做操作浏览器自动化的VB程序。 如何自动化已经打开的浏览器&#xff1f; http://chromedriver.storage.googleapis.com/index.html 首先寻找驱动&#xff0c;最新的驱动只支持到浏览器114&#xff0c;我在网上下载的浏览器是9…

现货白银交易中spring形态的应用

在现货白银市场中交易想取得成功并从市场中获利&#xff0c;掌握一些工具是必不可少的&#xff0c;而今天我们要介绍的现货白银的交易工具就是spring形态。 对于spring这个英文&#xff0c;我们都很熟悉&#xff0c;它有春天的意思&#xff0c;但这里所说的spring形态并不是指春…

ComfyUI进阶:Comfyroll节点 (最终篇)+应用实例

前言&#xff1a; 学习ComfyUI是一场持久战&#xff0c;而Comfyroll 是一款功能强大的自定义节点集合&#xff0c;专为 ComfyUI 用户打造&#xff0c;旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点&#xff0c;用户可以在静态图像的精细调整和动态动画的复杂构建…

使用docker部署后端项目后,拿不到linux中的文件

大概率是没有做文件映射 在Docker容器中创建一个路径&#xff08;例如/app/data&#xff09;&#xff0c;并在此路径上进行映射&#xff0c;可以通过Dockerfile和Docker Compose的组合来实现。以下是具体步骤&#xff1a; 1. 创建Dockerfile&#xff1a;在Dockerfile中&#…

PTA - 身体质量指数(高教社,《Python编程基础及应用》习题6-3

身体质量指数&#xff08;英文为Body Mass Index&#xff0c;简称BMI&#xff09;&#xff0c;其值为体重除以身高的平方。体重单位为千克&#xff0c;身高 单位为米。BMI是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。下面是16岁以上人群的BMI图 表&#xff1a;…

第2节课:文本内容与格式化——HTML中的文本处理技巧

目录 文本内容与格式化&#xff1a;段落和标题&#xff1a;构建文本基础段落 <p>标题 <h1> 到 <h6> 格式化&#xff1a;强调和样式加粗 <b>斜体 <i>下划线 <u> 列表&#xff1a;组织内容无序列表 <ul>有序列表 <ol>定义列表 &…

【LabVIEW作业篇 - 5】:水仙花数、数组与for循环的连接

文章目录 水仙花数数组与for循环的连接 水仙花数 水仙花数&#xff0c;是指一个3位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身。如371 3^3 7^3 1^3&#xff0c;则371是一个水仙花数。 思路&#xff1a;水仙花数是一个三位数&#xff0c;通过使用for循环&#xf…

redis的使用场景和持久化方式

redis的使用场景 热点数据的缓存。热点&#xff1a;频繁读取的数据。限时任务的操作&#xff1a;短信验证码。完成session共享的问题完成分布式锁。 redis的持久化方式 什么是持久化&#xff1a;把内存中的数据存储到磁盘的过程&#xff0c;同时也可以把磁盘中的数据加载到内存…

FPGA实现二选一数据选择器

在FPGA开发当中&#xff0c;我们最早开始接触的就是关于二选一选择器的设计。 1、原理 通过一个sel选择位判断输出out为a还是b&#xff0c;这里我们规定&#xff1a; sel0时&#xff0c;outa sel1时&#xff0c;outb 2、工程代码 多路选择器的缩写为MUX&#xff0c;这里我们见…

Git报错fatal: detected dubious ownership in repository

报错信息 fatal: detected dubious ownership in repository at 解决办法 一行代码解决 git config --global --add safe.directory "*";如何使用git工具初始胡项目并且和远程仓库建立联系 git init–建立一个本地仓库 git add README.md–将README.md文件加入…

【Day1415】Bean管理、SpringBoot 原理、总结、Maven 高级

0 SpringBoot 配置优先级 从上到下 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml是主流&#xff09; 1 Bean管理 1.1 从 IOC 容器中获取 Bean 1.2 Bean 作品域 可以通过注解 Scope("proto…

计算机网络八股文(后续更新)

文章目录 一、计算机网络体系结构1、计算机网络的各层协议及作用&#xff1f; 二、物理层三、数据链路层四、网络层五、传输层1、TCP和UDP的区别&#xff1f;2、UDP 和 TCP 对应的应用场景是什么&#xff1f;3、详细介绍一下 TCP 的三次握手机制4、为什么需要三次握手&#xff…

测试管理工具、自动化测试工具、跨浏览器测试工具 推荐

测试管理工具 1&#xff09;Xray Xray 是排名第一的手动与自动化测试管理应用&#xff0c;专为质量保证而设计。它是一个功能齐全的工具&#xff0c;能够无缝集成于 Jira 中。其目的是通过有效和高效的测试帮助公司提高产品质量。 功能特点&#xff1a; 需求、测试、缺陷和执…

Java | Leetcode Java题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution {public int hIndex(int[] citations) {int n citations.length;int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right mid - 1;} else {lef…

数学建模(5)——逻辑回归

一、二分类 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklea…