掌握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.pswp.cn/news/163013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163013.shtml
英文地址,請注明出處:http://en.pswp.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…