命令模式和责任链模式有什么区别?
时间: 2023-12-12 08:02:10 浏览: 66
命令模式和责任链模式都是行为型设计模式,但它们的作用略有不同:
1. 命令模式将请求封装成一个对象,使得可以将请求的发送者和请求的接收者解耦。请求发送者只需要知道如何发送请求,而不必知道请求的具体内容和接收者是谁。而请求接收者只需要知道如何执行请求,而不必知道请求的具体来源和请求的上下文环境。
2. 责任链模式将请求的发送者和请求的接收者都封装成一个对象,使得请求从一个对象传递到另一个对象,直到有一个对象处理请求为止。每一个对象都可以处理请求,也可以将请求传递给下一个对象。这种方式可以动态的组合对象来处理请求,而不需要在代码中指定请求的处理方式。
简而言之,命令模式适用于将请求和处理请求的对象解耦,使得请求的发送者和接收者可以独立变化;而责任链模式适用于将请求和处理请求的对象动态组合起来,使得请求可以从一个对象传递到另一个对象,直到有一个对象处理请求为止。
相关问题
利用观察者模式、责任链模式和命令模式,写一个红绿灯信号通行的代码
好的,以下是一个实现红绿灯信号通行的示例代码,使用观察者模式、责任链模式和命令模式:
首先,定义一个接口 Observer,表示观察者:
```java
interface Observer {
void update();
}
```
然后,定义一个抽象类 AbstractSubject,表示主题,包含添加、删除和通知观察者等方法。
```java
abstract class AbstractSubject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
```
接着,定义一个 TrafficLight 类,表示红绿灯。这个类继承自抽象类 AbstractSubject,实现 Runnable 接口,表示可以被线程执行。
```java
class TrafficLight extends AbstractSubject implements Runnable {
private boolean red = true;
public void run() {
while (true) {
try {
Thread.sleep(5000);
red = !red;
notifyObservers();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public boolean isRed() {
return red;
}
}
```
在红绿灯变化时,调用 notifyObservers() 方法来通知观察者。
然后,定义一个命令接口 Command,表示命令。
```java
interface Command {
void execute();
}
```
接着,定义一个 LightCommand 类,表示红绿灯命令,实现命令接口 Command。这个类的构造方法接收一个 TrafficLight 对象和一个 boolean 值,表示该命令处理红灯还是绿灯。
```java
class LightCommand implements Command {
private TrafficLight trafficLight;
private boolean red;
public LightCommand(TrafficLight trafficLight, boolean red) {
this.trafficLight = trafficLight;
this.red = red;
}
public void execute() {
if ((red && trafficLight.isRed()) || (!red && !trafficLight.isRed())) {
System.out.println("通过红绿灯");
} else {
System.out.println("红绿灯未通过");
}
}
}
```
最后,定义一个责任链类 Chain,表示责任链。这个类的构造方法接收多个命令,使用责任链模式依次执行这些命令。
```java
class Chain {
private List<Command> commands = new ArrayList<>();
public Chain(Command... commands) {
for (Command command : commands) {
this.commands.add(command);
}
}
public void execute() {
for (Command command : commands) {
command.execute();
}
}
}
```
在程序入口处,创建 TrafficLight 对象,并将两个 LightCommand 对象作为参数创建一个责任链 Chain 对象。然后启动一个线程执行 TrafficLight 对象。在主线程中,可以通过 Chain 对象依次执行红灯和绿灯命令。
```java
public class Main {
public static void main(String[] args) {
TrafficLight trafficLight = new TrafficLight();
Chain chain = new Chain(
new LightCommand(trafficLight, true),
new LightCommand(trafficLight, false)
);
new Thread(trafficLight).start();
while (true) {
chain.execute();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
这样,就可以通过观察者模式、责任链模式和命令模式实现简单的红绿灯信号通行。
设计模式的看法和认知,有哪些设计模式?
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式的好处在于可以重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式提供了一个标准的术语系统,且具体到特定的情景。合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案。根据参考书《Design Patterns - Elements of Reusable Object-Oriented Software》中所提到的,总共有23种设计模式,可以分为三大类:创建型模式、结构型模式和行为型模式。其中,创建型模式关注对象的创建过程,结构型模式关注对象的组合,行为型模式关注对象之间的通信和交互。常见的设计模式包括但不限于:
1.创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
2.结构型模式:适配器模式、桥接模式、装饰器模式、组合模式、外观模式、享元模式、代理模式。
3.行为型模式:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。
另外,还有一类设计模式是J2EE设计模式,主要用于解决企业级应用程序开发中的问题。常见的J2EE设计模式包括但不限于:MVC模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式等。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)