掌握Java关键字与面试技巧的完美结合!

问题:请说明什么是策略模式,并使用Java代码举例说明其使用场景和实现方式。

答案:
策略模式是一种行为型设计模式,它允许在运行时根据不同的情况选择不同的算法或策略。它将每个可选的算法封装成一个独立的类,从而使得它们可以互相替换,而不影响到客户端代码。这样,客户端可以根据需要选择不同的策略来完成某个任务。

策略模式的核心思想是将算法的定义和使用分离,将算法封装在各个具体策略类中,而不是放在一个单一的类中,通过使用不同的策略类对象来实现不同的行为。这样,当需要修改或者添加新的算法时,只需要新增一个策略类即可,而不需要修改已有的代码。

示例代码:

首先定义一个策略接口(IStrategy),该接口定义了一个抽象方法(doOperation)来执行具体的算法:

public interface IStrategy {
void doOperation();
}

然后,实现两个具体的策略类,分别是AddStrategy和SubstractStrategy,它们实现了IStrategy接口,并分别对应不同的算法:

public class AddStrategy implements IStrategy {
@Override
public void doOperation() {
System.out.println(“执行加法操作”);
}
}

public class SubstractStrategy implements IStrategy {
@Override
public void doOperation() {
System.out.println(“执行减法操作”);
}
}

最后,定义一个策略上下文类(Context),它包含一个策略对象,并提供设置策略对象和执行策略的方法:

public class Context {
private IStrategy strategy;

public void setStrategy(IStrategy strategy) {this.strategy = strategy;
}public void executeStrategy() {strategy.doOperation();
}

}

客户端可以根据需要选择不同的策略来执行相应的算法:

public class Main {
public static void main(String[] args) {
Context context = new Context();

    // 使用加法策略context.setStrategy(new AddStrategy());context.executeStrategy();// 使用减法策略context.setStrategy(new SubstractStrategy());context.executeStrategy();
}

}

运行结果:
执行加法操作
执行减法操作

策略模式适用于以下场景:

  1. 当需要在运行时根据不同的情况选择不同的算法时,可以使用策略模式。例如,一个电商平台的促销活动,根据不同的时间段选择不同的折扣策略。
  2. 当一个类中包含多个条件语句,每个条件都对应不同的行为时,可以考虑使用策略模式。通过将每个条件对应的行为封装成独立的策略类,可以提高代码的可读性和扩展性。
  3. 当需要在不同的场景下灵活地切换算法时,可以使用策略模式。例如,一个游戏的角色可以根据不同的武器选择不同的攻击策略。

策略模式的优点包括:

  1. 提供了可扩展性,新增策略类不会影响到客户端代码。
  2. 提高了代码的可读性和可维护性,通过将算法的定义和使用分离,使得代码更加清晰。

总结:
策略模式是一种非常常用的设计模式,它能够提供一种灵活的方式来选择不同的算法或策略。通过将算法封装成独立的策略类,可以实现算法的可扩展性、可复用性和可维护性。在实际开发中,我们可以根据具体的业务需求来选择是否使用策略模式来优化代码结构。

问题:请说明什么是模板方法模式,并使用Java代码举例说明其使用场景和实现方式。

答案:
模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

在模板方法模式中,一个抽象类定义了一个模板方法,该方法中包含了算法的主要逻辑和步骤的顺序,同时也可以定义一些默认实现或者使用关键字"abstract"声明一些抽象方法,这些抽象方法的具体实现由子类来完成。

使用模板方法模式的场景通常是在一个算法中有固定的步骤和变化的细节时。通过将这些固定的步骤封装在父类的模板方法中,子类可以根据实际需求来实现对应的细节。

示例代码:

首先,定义一个抽象类(AbstractClass),该类中包含一个模板方法(templateMethod)和多个抽象方法(primitiveOperation):

public abstract class AbstractClass {
public void templateMethod() {
// 步骤1
step1();

    // 步骤2step2();// 步骤3step3();
}public abstract void step1();public abstract void step2();public abstract void step3();

}

然后,实现两个具体的子类,分别是ConcreteClassA和ConcreteClassB,它们继承了AbstractClass并实现了其中的抽象方法:

public class ConcreteClassA extends AbstractClass {
@Override
public void step1() {
System.out.println(“ConcreteClassA 的步骤1”);
}

@Override
public void step2() {System.out.println("ConcreteClassA 的步骤2");
}@Override
public void step3() {System.out.println("ConcreteClassA 的步骤3");
}

}

public class ConcreteClassB extends AbstractClass {
@Override
public void step1() {
System.out.println(“ConcreteClassB 的步骤1”);
}

@Override
public void step2() {System.out.println("ConcreteClassB 的步骤2");
}@Override
public void step3() {System.out.println("ConcreteClassB 的步骤3");
}

}

客户端使用模板方法模式创建具体子类的实例,然后调用模板方法来执行算法:

public class Main {
public static void main(String[] args) {
AbstractClass classA = new ConcreteClassA();
classA.templateMethod();

    AbstractClass classB = new ConcreteClassB();classB.templateMethod();
}

}

运行结果:
ConcreteClassA 的步骤1
ConcreteClassA 的步骤2
ConcreteClassA 的步骤3
ConcreteClassB 的步骤1
ConcreteClassB 的步骤2
ConcreteClassB 的步骤3

模板方法模式适用于以下场景:

  1. 当有一个算法的骨架,但其中的某些步骤的具体实现可能有所不同时,可以使用模板方法模式。通过将不同的实现延迟到子类中,可以实现代码的复用和扩展。
  2. 当需要控制算法的执行顺序,但又希望子类能够灵活地改变其中某些步骤时,可以考虑使用模板方法模式。通过在抽象类中定义模板方法,并将某些步骤声明为抽象方法,可以保证算法的逻辑一致性,同时提供灵活性。

模板方法模式的优点包括:

  1. 提高了代码的复用性,将公共的代码放在父类的模板方法中,子类只需要实现特定的步骤。
  2. 提高了代码的可扩展性,通过继承抽象类,可以增加新的子类来改变算法的某些实现细节。

总结:
模板方法模式是一种简单但非常实用的设计模式,它提供了一种定义算法框架的方式,并允许子类在不改变算法结构的情况下重新定义算法的细节。在实际开发中,我们可以根据具体的业务逻辑和需求来决定是否使用模板方法模式,以提高代码的灵活性和可维护性。

问题:请说明什么是观察者模式,并使用Java代码举例说明其使用场景和实现方式。

答案:
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,其所有依赖对象都会得到通知并自动更新。

在观察者模式中,有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它维护一个观察者列表,提供注册和删除观察者的方法,并定义了通知观察者的方法。观察者则是接收主题通知并进行相应处理的对象。

使用观察者模式的场景通常是当一个对象的改变需要同时通知其他对象,并且不确定有多少个对象需要被通知时。观察者模式可以实现对象的解耦,让被观察对象和观察者对象之间松耦合,提高代码的灵活性和可维护性。

示例代码:

首先,定义一个主题接口(Subject),包含注册、删除和通知观察者的方法:

public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}

然后,实现一个具体主题类(ConcreteSubject),实现主题接口,并在状态发生变化时通知观察者:

import java.util.ArrayList;
import java.util.List;

public class ConcreteSubject implements Subject {
private List observers = new ArrayList<>();
private String state;

public void setState(String state) {this.state = state;notifyObservers();
}@Override
public void registerObserver(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);}
}

}

接着,定义一个观察者接口(Observer),包含一个更新方法:

public interface Observer {
void update(String state);
}

最后,实现一个具体观察者类(ConcreteObserver),实现观察者接口,并在接收到通知时进行相应处理:

public class ConcreteObserver implements Observer {
private String name;

public ConcreteObserver(String name) {this.name = name;
}@Override
public void update(String state) {System.out.println(name + " 收到通知,当前状态为:" + state);
}

}

客户端使用观察者模式创建具体主题和观察者的实例,并注册观察者到主题上:

public class Main {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();

    Observer observer1 = new ConcreteObserver("Observer1");Observer observer2 = new ConcreteObserver("Observer2");Observer observer3 = new ConcreteObserver("Observer3");subject.registerObserver(observer1);subject.registerObserver(observer2);subject.registerObserver(observer3);subject.setState("状态更新了");
}

}

运行结果:
Observer1 收到通知,当前状态为:状态更新了
Observer2 收到通知,当前状态为:状态更新了
Observer3 收到通知,当前状态为:状态更新了

观察者模式适用于以下场景:

  1. 当一个对象的改变需要通知其他多个对象,并且不确定有多少对象需要被通知时,可以使用观察者模式。通过定义观察者接口和主题接口,实现对象之间的松耦合,让主题对象的状态改变能够自动通知所有观察者对象。
  2. 当一个对象的改变需要触发一系列与之相关的操作时,可以考虑使用观察者模式。观察者模式可以将变化和相应的操作分离开来,实现对象的解耦,提高可维护性和扩展性。

观察者模式的优点包括:

  1. 观察者模式实现了对象之间的松耦合,主题对象和观察者对象之间的依赖关系被解耦,使得系统更加灵活和可维护。
  2. 观察者模式支持广播通信,当一个对象的状态发生变化时,可以同时通知多个观察者对象,简化了对象之间的通信方式。

总结:
观察者模式是一种简单但非常实用的设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,其所有依赖对象都会得到通知并自动更新。在实际开发中,我们可以根据具体的业务逻辑和需求来决定是否使用观察者模式,以实现对象之间的解耦和灵活性。

问题:请说明什么是迭代子模式,并使用Java代码举例说明其使用场景和实现方式。

答案:

迭代子模式是一种行为型设计模式,它提供了一种遍历容器内元素的方法,而不需要暴露容器的内部结构。迭代子模式将容器与遍历操作分离开来,使得容器的实现和遍历算法可以独立变化。

在迭代子模式中,有两个主要角色:容器(Container)和迭代子(Iterator)。容器是一个包含元素的对象,定义了获取迭代子对象的方法。迭代子则是用于遍历容器内元素的对象,它提供了访问元素和判断是否还有下一个元素的方法。

使用迭代子模式的场景通常是在需要遍历一个容器对象,并且希望遍历操作与容器的具体实现分离开来。迭代子模式可以使得容器的实现和遍历算法可以独立变化,使得代码更加灵活和可维护。

示例代码:

首先,定义一个容器接口(Container),包含获取迭代子的方法:

public interface Container {
Iterator getIterator();
}

然后,定义一个迭代子接口(Iterator),包含访问元素和判断是否还有下一个元素的方法:

public interface Iterator {
boolean hasNext();
Object next();
}

接着,实现一个具体容器类(ConcreteContainer),实现容器接口,并返回一个具体迭代子对象:

public class ConcreteContainer implements Container {
private Object[] elements;

public ConcreteContainer(Object[] elements) {this.elements = elements;
}@Override
public Iterator getIterator() {return new ConcreteIterator();
}private class ConcreteIterator implements Iterator {private int index;@Overridepublic boolean hasNext() {return index < elements.length;}@Overridepublic Object next() {if (hasNext()) {return elements[index++];}return null;}
}

}

最后,客户端使用迭代子模式遍历容器对象:

public class Main {
public static void main(String[] args) {
Object[] elements = {1, 2, 3, 4, 5};
Container container = new ConcreteContainer(elements);
Iterator iterator = container.getIterator();

    while (iterator.hasNext()) {Object element = iterator.next();System.out.println(element);}
}

}

运行结果:
1
2
3
4
5

迭代子模式适用于以下场景:

  1. 当需要遍历一个容器对象,并且希望遍历操作与容器的具体实现分离开来时,可以考虑使用迭代子模式。迭代子模式将容器的实现和遍历算法解耦,使得代码更加灵活和可维护。
  2. 当需要对容器对象进行多种遍历操作,并且不希望重复实现遍历算法时,可以使用迭代子模式。迭代子模式可以通过实现不同的迭代子对象,来支持容器对象的不同遍历方式。

迭代子模式的优点包括:

  1. 迭代子模式将容器的实现和遍历算法分离,使得代码结构更加清晰,易于维护和扩展。
  2. 迭代子模式可以隐藏容器的内部结构,提供一种统一的访问方式,提高代码的灵活性和可复用性。

总结:
迭代子模式是一种实用的设计模式,它提供了一种遍历容器内元素的方法,并且将容器的实现和遍历算法分离开来,使得代码结构更加清晰和可维护。在实际开发中,我们可以根据具体的需求和场景来决定是否使用迭代子模式,以提高代码的灵活性和可复用性。

问题:请说明什么是责任链模式,并使用Java代码举例说明其使用场景和实现方式。

答案:

责任链模式是一种行为型设计模式,它将请求的发送者和接收者解耦,从而实现请求的处理者链式传递。责任链模式的核心思想是将多个处理者组成一条链,每个处理者都有机会处理请求,直到其中一个处理者能够处理为止。

在责任链模式中,有两个主要角色:抽象处理者(Handler)和具体处理者(ConcreteHandler)。抽象处理者定义了处理请求的方法,并持有下一个处理者的引用,具体处理者负责实际处理请求的逻辑。当一个请求从链首开始传递时,每个处理者都有机会处理请求,直到其中一个处理者能够处理为止。

使用责任链模式的场景通常是当有多个对象可以处理同一请求时,且处理者之间的顺序不确定时。责任链模式可以动态地组织处理者的顺序,并且将请求发送给合适的处理者,从而实现对请求的灵活处理。

示例代码:

首先,定义一个抽象处理者接口(Handler),其中包含处理请求和设置下一个处理者的方法:

public abstract class Handler {
protected Handler nextHandler;

public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;
}public abstract void handleRequest(String request);

}

然后,实现具体处理者类(ConcreteHandler),实现处理请求的逻辑,并在处理完成后将请求传递给下一个处理者:

public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals(“A”)) {
System.out.println(“ConcreteHandlerA处理请求:” + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}

public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals(“B”)) {
System.out.println(“ConcreteHandlerB处理请求:” + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}

public class ConcreteHandlerC extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals(“C”)) {
System.out.println(“ConcreteHandlerC处理请求:” + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}

最后,客户端使用责任链模式发送请求并处理:

public class Main {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();

    handlerA.setNextHandler(handlerB);handlerB.setNextHandler(handlerC);handlerA.handleRequest("B");
}

}

运行结果:
ConcreteHandlerB处理请求:B

责任链模式适用于以下场景:

  1. 当有多个对象可以处理同一请求,且处理者之间的顺序不确定时,可以考虑使用责任链模式。责任链模式可以动态地组织处理者的顺序,并且将请求发送给合适的处理者。
  2. 当需要避免请求发送者和接收者之间的耦合关系时,可以使用责任链模式。责任链模式将请求的发送者和接收者解耦,使得请求的处理者链式传递。

责任链模式的优点包括:

  1. 责任链模式将请求发送者和接收者解耦,提高代码的灵活性和可维护性。可以动态地组织和调整处理者的顺序,使得系统更加灵活和可扩展。
  2. 责任链模式可以避免请求发送者和接收者之间的直接耦合关系,提高代码的可复用性和可测试性。

总结:
责任链模式是一种实用的设计模式,它将请求的发送者和接收者解耦,实现请求的处理者链式传递。在实际开发中,我们可以根据具体的需求和场景来决定是否使用责任链模式,以提高代码的灵活性和可维护性。

问题:请说明什么是命令模式,并使用Java代码举例说明其使用场景和实现方式。

答案:

命令模式是一种行为型设计模式,它将请求封装成一个独立的对象,从而使得请求的发送者和接收者解耦。在命令模式中,将请求封装成一个命令对象,请求发送者通过调用命令对象的方法来发起请求,接收者则负责执行实际的操作。

命令模式的核心结构包括四个主要角色:命令(Command)、具体命令(ConcreteCommand)、请求者(Invoker)和接收者(Receiver)。命令角色负责定义命令的接口,具体命令角色实现了命令接口并封装了具体的操作,请求者角色负责调用命令对象来执行请求,接收者角色负责执行实际的操作。

使用命令模式的场景通常是需要将请求的发送者和接收者解耦,并且希望能够以不同的请求参数执行不同的操作。命令模式可以将请求封装成一个对象,并提供一种统一的方式来调用不同的命令对象,从而实现对请求的灵活处理。

示例代码:

首先,定义一个命令接口(Command),包含一个执行命令的方法:

public interface Command {
void execute();
}

然后,实现具体的命令类(ConcreteCommand),实现具体的操作:

public class ConcreteCommand implements Command {
private Receiver receiver;

public ConcreteCommand(Receiver receiver) {this.receiver = receiver;
}@Override
public void execute() {receiver.action();
}

}

接下来,定义一个接收者类(Receiver),负责执行实际的操作:

public class Receiver {
public void action() {
System.out.println(“执行实际的操作”);
}
}

最后,创建一个请求者类(Invoker),负责调用命令对象来执行请求:

public class Invoker {
private Command command;

public Invoker(Command command) {this.command = command;
}public void executeCommand() {command.execute();
}

}

客户端使用命令模式来实现请求的发送和接收:

public class Main {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);

    invoker.executeCommand();
}

}

运行结果:
执行实际的操作

命令模式适用于以下场景:

  1. 当需要将请求的发送者和接收者解耦时,可以使用命令模式。命令模式通过将请求封装成一个独立的对象,使得发送者和接收者之间不直接交互,从而提高代码的灵活性和可维护性。
  2. 当需要支持撤销、重做等操作时,可以考虑使用命令模式。命令模式可以很方便地实现对请求的撤销和重做,只需保存命令对象的历史记录,并根据需要执行相应的操作。

命令模式的优点包括:

  1. 命令模式将请求的发送者和接收者解耦,提高代码的灵活性和可维护性。发送者只需调用命令对象的方法来发起请求,而无需知道具体的接收者和操作。
  2. 命令模式可以很方便地支持撤销、重做等操作。可以通过保存命令对象的历史记录,根据需要执行相应的操作。

总结:
命令模式是一种实用的设计模式,它将请求封装成一个独立的对象,从而实现请求的发送者和接收者解耦。在实际开发中,我们可以根据具体的需求和场景来决定是否使用命令模式,以提高代码的灵活性和可维护性。

问题:请说明什么是备忘录模式,并使用Java代码举例说明其使用场景和实现方式。

答案:

备忘录模式是一种行为型设计模式,用于在不破坏封装的情况下保存和恢复对象的内部状态。备忘录模式通过将对象的状态封装到备忘录对象中,从而在需要时可以轻松地还原对象的状态。

备忘录模式的核心结构包括三个主要角色:发起人(Originator)、备忘录(Memento)和管理者(Caretaker)。发起人角色负责创建备忘录对象,并将自身的状态保存到备忘录对象中。备忘录角色负责存储发起人对象的内部状态。管理者角色负责管理备忘录对象,可以存储多个备忘录对象,并在需要时将某个备忘录对象返回给发起人对象来恢复其状态。

使用备忘录模式的场景通常是需要保存对象的某个历史状态,以便在后续需要时进行恢复。备忘录模式可以很好地支持对象的撤销、重做等操作,同时也可以用于实现对象的快照功能。

示例代码:

首先,定义一个备忘录类(Memento),用于存储发起人对象的状态:

public class Memento {
private String state;

public Memento(String state) {this.state = state;
}public String getState() {return state;
}

}

然后,定义一个发起人类(Originator),负责创建备忘录对象和恢复状态:

public 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();
}

}

最后,定义一个管理者类(Caretaker),负责管理备忘录对象:

public class Caretaker {
private List mementoList = new ArrayList<>();

public void addMemento(Memento memento) {mementoList.add(memento);
}public Memento getMemento(int index) {return mementoList.get(index);
}

}

客户端使用备忘录模式来保存和恢复对象的状态:

public class Main {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();

    originator.setState("State 1");caretaker.addMemento(originator.createMemento());originator.setState("State 2");caretaker.addMemento(originator.createMemento());originator.setState("State 3");caretaker.addMemento(originator.createMemento());System.out.println("Current state: " + originator.getState());originator.restoreMemento(caretaker.getMemento(1));System.out.println("Restored state: " + originator.getState());
}

}

运行结果:
Current state: State 3
Restored state: State 2

备忘录模式适用于以下场景:

  1. 当需要保存和恢复对象的历史状态时,可以使用备忘录模式。备忘录模式允许将对象的状态封装到备忘录对象中,并在需要时进行恢复,从而实现对象状态的保存和还原。
  2. 当需要实现对象的撤销、重做等操作时,可以考虑使用备忘录模式。备忘录模式可以很方便地实现对象状态的保存和恢复,从而支持撤销、重做等操作。

备忘录模式的优点包括:

  1. 备忘录模式可以实现对象状态的保存和恢复,从而提供了一种简单且灵活的方式来保存对象的历史状态。
  2. 备忘录模式可以很好地支持对象的撤销、重做等操作,提高了系统的灵活性和可维护性。

总结:
备忘录模式是一种实用的设计模式,用于保存和恢复对象的历史状态。在实际开发中,我们可以根据具体的需求和场景来决定是否使用备忘录模式,以实现对象状态的保存和恢复,以及对象的撤销、重做等操作。

问题:请说明什么是状态模式,并使用Java代码举例说明其使用场景和实现方式。

答案:

状态模式是一种行为型设计模式,用于在对象内部状态改变时改变其行为。状态模式将对象的行为与其所处的状态进行解耦,使得对象在不同状态下可以有不同的行为,并且可以动态地切换状态。

状态模式的核心结构包括三个主要角色:环境类(Context)、抽象状态类(State)和具体状态类(ConcreteState)。环境类负责维护当前状态,并将请求委派给当前状态处理。抽象状态类定义了一个接口,用于封装特定状态下的行为。具体状态类实现了抽象状态类定义的接口,负责处理特定状态下的请求。

使用状态模式的场景通常是当一个对象的行为取决于其状态,并且需要根据不同的状态执行不同的行为时。状态模式可以避免使用大量的if-else语句或switch-case语句来处理不同状态下的行为,使代码更加可维护和可扩展。

示例代码:

首先,定义一个抽象状态类(State),用于封装特定状态下的行为:

public abstract class State {
protected Context context;

public void setContext(Context context) {this.context = context;
}public abstract void handle();

}

然后,定义具体状态类(ConcreteState)实现抽象状态类:

public class ConcreteStateA extends State {
@Override
public void handle() {
System.out.println(“Handle in state A”);
context.setState(new ConcreteStateB());
}
}

public class ConcreteStateB extends State {
@Override
public void handle() {
System.out.println(“Handle in state B”);
context.setState(new ConcreteStateA());
}
}

接下来,定义环境类(Context),负责维护当前状态并委派请求给当前状态处理:

public class Context {
private State state;

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

}

客户端使用状态模式来改变对象的行为:

public class Main {
public static void main(String[] args) {
Context context = new Context();

    State stateA = new ConcreteStateA();context.setState(stateA);context.request(); // 输出:Handle in state Acontext.request(); // 输出:Handle in state Bcontext.request(); // 输出:Handle in state A
}

}

运行结果:
Handle in state A
Handle in state B
Handle in state A

状态模式适用于以下场景:

  1. 当一个对象的行为取决于其状态,并且需要根据不同的状态执行不同的行为时,可以使用状态模式。状态模式可以将对象的行为与其所处的状态解耦,使得对象在不同状态下可以有不同的行为,并且可以动态地切换状态。
  2. 当对象的行为随着其内部状态的改变而改变,并且状态转换的规则相对复杂时,可以考虑使用状态模式。状态模式将不同状态的行为进行封装,使得状态转换的逻辑更加清晰,代码更加可维护和可扩展。

状态模式的优点包括:

  1. 状态模式可以将对象行为与其所处的状态解耦,使得对象在不同状态下可以有不同的行为。
  2. 状态模式可以避免使用大量的if-else语句或switch-case语句来处理不同状态下的行为,使代码更加可维护和可扩展。
  3. 状态模式符合开闭原则,当需要新增状态时,只需要添加新的具体状态类即可,不需要修改原有代码。

总结:
状态模式是一种实用的设计模式,用于在对象内部状态改变时改变其行为。在实际开发中,我们可以根据具体的需求和场景来决定是否使用状态模式,以实现对象行为的灵活变化,并提高代码的可维护性和可扩展性。

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

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

相关文章

服务号可以迁移到订阅号吗

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要看一下服务号和订阅号的主要区别。1、服务号推送的消息没有折叠&#xff0c;消息出现在聊天列表中&#xff0c;会像收到消息一样有提醒。而订阅号推送的消息是折叠的&#xff0c;“订阅号…

RHEL 8.6 Kubespray 1.23.1 install kubernetes v1.27.7

文章目录 1. 预备条件配置网卡download01 节点安装 nerdctl3. download01 节点 介质下载4. bastion01节点配置 yum 源5. bastion01 离线安装 nerdctl安装l insecure registry配置镜像入库执行 set-all.sh7. bastion01 配置互信8. 启动容器部署环境9. 部署前准备9.1 配置 extrac…

分布式篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、你知道哪些分布式事务解决方案?二、什么是二阶段提交?三、什么是三阶段提交?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你…

基于Pytorch框架多人多摄像头摔倒跌倒坠落检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在计算机视觉领域的应用已经取得了显著的进展&#xff0c;特别是在多人多摄像头场景下的摔倒跌倒检测。通过…

java异常 try/catch/throw/throws

try-catch一般用在最上层的程序里&#xff0c;可以配合throws和throw再将异常抛给用户&#xff0c;这种情况会使上层代码中断。也可以不选择抛出&#xff0c;这种上层代码会继续运行。 被调用的方法如果有异常的可能可以通过throws抛给上层处理&#xff0c;不加try catch的情况…

Vue环境的搭建

1.Vue开发的两种方式 &#xff08;1&#xff09;核心包传统开发模式 基于html/css/js文件&#xff0c;直接引入和辛堡&#xff0c;开发Vue。 &#xff08;2&#xff09;工程化开发模式&#xff1a; 主要是基于构建工具&#xff08;例如,webpack&#xff09;的环境中开发Vue…

【ARM 嵌入式 编译系列 2.2 -- 如何在Makefile 中添加编译时间 | 编译作者| 编译 git id】

请阅读【ARM GCC 编译专栏导读】 上篇文章&#xff1a;【ARM 嵌入式 编译系列 2.1 – GCC 编译参数学习】 下篇文章&#xff1a;【ARM 嵌入式 编译系列 2.3 – GCC 中指定 ARMv8-M 的 Thumb 指令集参数详细介绍】 文章目录 编译参数介绍 编译参数介绍 通常我们在 OS 启动的时…

福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换

一、实验目的 在深度学习中&#xff0c;往往需要从一张大图中裁剪出一张张小图&#xff0c;以便适应网络输入图像的尺寸&#xff0c;这可以通过bmcv_image_crop函数实现。 实践中&#xff0c;经常需要对输入图像的尺寸进行调整&#xff0c;以适用于网络输入图片尺寸&#xff0…

查看sql语句执行计划并重建索引

晚上cpu报警显示当前cpu使用率达到90%以上&#xff0c;不到10%的空闲 先查询当前sql&#xff1a; #&#xff08;ORACLE&#xff09; SQL > set line 200 pages 1000 col event for a30 col program for a30 col username for a12 col sql_id for a15 col INST_ID for 9999 …

前端开发学习 (二) 事件修饰符、系统命令

其实&#xff0c;我们上一章的时候就已经说过了一些系统指令&#xff0c;这里详细介绍一下 一、v-on的事件修饰符 事件作用click点击时触发submit表单被提交时触发input输入框发生改变时触发keyup按键松开时触发keydown按键按下时触发mouseover鼠标悬停触发mouseout当鼠标移开…

安徽省广德市选择云轴科技ZStack Cloud云平台建设县级智慧城市

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

错误记录:AttributeError/TypeError

【pycharm】报错&#xff1a;AttributeError: partially initialized module ‘numpy’ has no attribute ‘array’ (most likely due to a circular import)的错误 文件名与调用包的名称一致引起歧义 解决办法&#xff1a;修改文件名重新run 【pycharm】报错&#xff1a;T…

【Web】NewStarCTF Week1 个人复现

目录 ①泄露的秘密 ②Begin of Upload ③Begin of HTTP ④ErrorFlask ⑤Begin of PHP ⑥R!C!E! ⑦EasyLogin ①泄露的秘密 盲猜/robots.txt,访问得到flag前半部分 第二个没试出来&#xff0c;老老实实拿dirsearch扫吧 访问/www.zip 下载附件&#xff0c;拿到第二部分…

SpringCloud原理-OpenFeign篇(一、Hello OpenFeign项目示例)

文章目录 前言正文一、项目结构二、服务调用链路说明三、Rpc调用链路说明四、项目代码4.1 client 模块中的feign接口4.2 client 中的rest接口4.3 client 中的启动类4.4 server中的rest接口4.5 server中的配置文件 五、调试 附录附1&#xff1a;本系列文章链接 前言 本篇是Spri…

示波器探头讲解及案例分享

示波器探头讲解 示波器探头 分为X1、X10档&#xff1a; X1档&#xff0c;表示被测量的信号没有经过衰减进入示波器 X10档&#xff0c;表示被测量的信号衰减10倍进入示波器&#xff08;当示波器也设置为10X档&#xff0c;直接读数即可&#xff0c;但是当示波器设置为1X档&…

vue 目录树的展开与关闭

目录 1、翻页方法中控制目录树节点的展开与关闭2、搜索目录树节点名称控制节点的展开与关闭 <el-tree:data"data_option"ref"tree":props"defaultProps"node-click"handleNodeClick":default-expanded-keys"needExpandedKeys&…

1、开发工具介绍及软件安装

软件安装 百度网盘链接&#xff1a;https://pan.baidu.com/s/1J7sgXntt9eLNBhI1Dc6MsQ?pwd2023 提取码&#xff1a;2023 # 一 Keil5安装步骤&#xff1a; 激活&#xff1a; STC-ISP安装步骤&#xff1a; STC-ISP.exe安装即用 安装CH340_CH341驱动程序 所有学习课程和资源…

【vue】ant-design-vue的树结构实现节点增删改查

根据业务需要&#xff0c;实现树结构的节点新增编辑删除功能&#xff0c;主要逻辑是利用树节点的scopedSlots属性对其进行自定义改造&#xff0c;监听悬停事件在节点右侧出现增删改对应图标&#xff0c;点击图标出现弹窗表单对内容进行修改&#xff0c;具体代码如下&#xff1a…

蓝桥杯每日一题2023.11.23

题目描述 题目分析 本题使用递归模拟即可&#xff0c;将每一个大格子都可以拆分看成几个小格子&#xff0c;先将最开始的数字进行填入&#xff0c;使每一个对应小格子的值都为大格子对应的数&#xff0c;搜索找到符合要求的即可 &#xff08;答案&#xff1a;50 33 30 41&am…

Vue3+ts学习笔记2

<script setup lang"ts"> import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from vueonBeforeMount(()>{console.log(---挂载之前---) })onMounted(()>{console.log(---挂载---) })onBeforeUpdate(()>{consol…