一.狀態(tài)模式介紹與使用場景
狀態(tài)模式是一種行為設計模式,它允許對象在內部狀態(tài)發(fā)生改變時改變其行為。該模式將對象的行為包裝在不同的狀態(tài)類中,使得對象的行為可以根據其當前狀態(tài)動態(tài)改變。
狀態(tài)模式通常由以下幾個角色組成:
環(huán)境類(Context):環(huán)境類是擁有狀態(tài)的對象,它將會根據當前狀態(tài)來執(zhí)行相應的行為。它維護了一個對抽象狀態(tài)類的引用,用于切換和委托不同的狀態(tài)處理。
抽象狀態(tài)類(State):抽象狀態(tài)類定義了一個接口,用于具體狀態(tài)類的實現。在該接口中聲明了具體狀態(tài)類需要實現的方法。
具體狀態(tài)類(Concrete State):具體狀態(tài)類實現了抽象狀態(tài)類的接口,并負責定義該狀態(tài)下的具體行為。它包含了對環(huán)境類的引用,可以根據需要切換環(huán)境類的狀態(tài)。
狀態(tài)模式的核心思想是通過將對象的行為包裝在不同的狀態(tài)類中,使得對象可以根據其當前狀態(tài)來改變行為,而不需要使用大量的條件判斷語句。
狀態(tài)模式適用場景:
當一個對象的行為取決于其內部狀態(tài),并且需要在運行時根據狀態(tài)改變行為時,狀態(tài)模式非常有用。它允許對象在不同狀態(tài)下執(zhí)行不同的操作,而不需要使用復雜的條件判斷語句。
當對象具有大量的狀態(tài)以及與每個狀態(tài)相關的行為時,狀態(tài)模式可以提供一種結構化的方式來管理和組織這些狀態(tài)和行為。每個狀態(tài)都可以表示為一個獨立的狀態(tài)類,使得代碼更加清晰、可讀性更高。
當需要向對象的狀態(tài)變化進行動態(tài)擴展時,狀態(tài)模式提供了一種靈活的解決方案。通過添加新的狀態(tài)類,并相應地調整環(huán)境類與狀態(tài)類之間的關聯,可以輕松地增加新的狀態(tài)和行為。
當多個對象需要共享同一組狀態(tài)時,狀態(tài)模式可以減少重復代碼的編寫。通過將狀態(tài)封裝在獨立的狀態(tài)類中,多個對象可以共享相同的狀態(tài)實例,從而節(jié)省內存和代碼維護成本。
總結起來,狀態(tài)模式適用于以下情況:
- 對象的行為取決于其內部狀態(tài),并且需要在運行時根據狀態(tài)改變行為。
- 對象具有多個狀態(tài)以及與每個狀態(tài)相關的行為。
- 需要動態(tài)擴展對象的狀態(tài)和行為。
- 多個對象需要共享同一組狀態(tài)。
通過使用狀態(tài)模式,可以將復雜的條件判斷邏輯轉化為一組獨立的狀態(tài)類,提高代碼的可讀性、可維護性和可擴展性。同時,狀態(tài)模式也能夠幫助我們將對象的狀態(tài)與行為進行解耦,使得代碼更加靈活和可復用。
二.狀態(tài)模式實現
?下面用一個簡單的demo描述一下狀態(tài)模式:
// 環(huán)境類 - 訂單
class Order {
private OrderState state;
public Order() {
state = new NewState();
}
public void setState(OrderState state) {
this.state = state;
}
public void process() {
state.processOrder(this);
}
}
// 抽象狀態(tài)類
interface OrderState {
void processOrder(Order order);
}
// 具體狀態(tài)類 - 新訂單
class NewState implements OrderState {
public void processOrder(Order order) {
System.out.println("Processing new order");
// 在新訂單狀態(tài)下的處理邏輯
// ...
order.setState(new ShippedState()); // 切換狀態(tài)
}
}
// 具體狀態(tài)類 - 已發(fā)貨訂單
class ShippedState implements OrderState {
public void processOrder(Order order) {
System.out.println("Processing shipped order");
// 在已發(fā)貨訂單狀態(tài)下的處理邏輯
// ...
order.setState(new DeliveredState()); // 切換狀態(tài)
}
}
// 具體狀態(tài)類 - 已交付訂單
class DeliveredState implements OrderState {
public void processOrder(Order order) {
System.out.println("Processing delivered order");
// 在已交付訂單狀態(tài)下的處理邏輯
// ...
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Order order = new Order();
order.process(); // 處理新訂單
order.process(); // 處理已發(fā)貨訂單
order.process(); // 處理已交付訂單
}
}
我們模擬了一個訂單的狀態(tài)變化過程。訂單類 Order
是擁有狀態(tài)的對象,它將根據當前狀態(tài)來執(zhí)行相應的行為。
抽象狀態(tài)類 OrderState
定義了一個接口 processOrder()
,具體狀態(tài)類 NewState
、ShippedState
和 DeliveredState
實現了該接口,并分別負責定義相應狀態(tài)下的具體行為。
在 Main
類的 main
方法中,我們創(chuàng)建了一個訂單對象,并連續(xù)調用了 process()
方法來處理訂單。初始狀態(tài)為新訂單狀態(tài),調用 process()
方法后會切換到已發(fā)貨訂單狀態(tài),再次調用 process()
方法后會切換到已交付訂單狀態(tài)。
通過使用狀態(tài)模式,訂單對象能夠根據不同的狀態(tài)來改變其行為,避免了大量的條件判斷語句,并使得代碼更加可擴展和易維護。
以上只是一個簡單的實現demo,實際開發(fā)中,還有很多場景適用于狀態(tài)模式,例如電商訂單的狀態(tài)流轉,下面我們寫一個實現電商訂單狀態(tài)流轉的狀態(tài)模式例子:
// 環(huán)境類 - 訂單
class Order {
private OrderState state;
public Order() {
state = new NewState();
}
public void setState(OrderState state) {
this.state = state;
}
public void process() {
state.processOrder(this);
}
public void cancel() {
state.cancelOrder(this);
}
}
// 抽象狀態(tài)類
interface OrderState {
void processOrder(Order order);
void cancelOrder(Order order);
}
// 具體狀態(tài)類 - 新訂單
class NewState implements OrderState {
public void processOrder(Order order) {
System.out.println("Processing new order");
// 在新訂單狀態(tài)下的處理邏輯
// ...
order.setState(new ShippedState()); // 切換狀態(tài)
}
public void cancelOrder(Order order) {
System.out.println("Cancelling new order");
// 在新訂單狀態(tài)下的取消邏輯
// ...
order.setState(new CancelledState()); // 切換狀態(tài)
}
}
// 具體狀態(tài)類 - 已發(fā)貨訂單
class ShippedState implements OrderState {
public void processOrder(Order order) {
System.out.println("Processing shipped order");
// 在已發(fā)貨訂單狀態(tài)下的處理邏輯
// ...
order.setState(new DeliveredState()); // 切換狀態(tài)
}
public void cancelOrder(Order order) {
System.out.println("Cancelling shipped order");
// 在已發(fā)貨訂單狀態(tài)下的取消邏輯
// ...
order.setState(new CancelledState()); // 切換狀態(tài)
}
}
// 具體狀態(tài)類 - 已交付訂單
class DeliveredState implements OrderState {
public void processOrder(Order order) {
System.out.println("Processing delivered order");
// 在已交付訂單狀態(tài)下的處理邏輯
// ...
}
public void cancelOrder(Order order) {
System.out.println("Cancelling delivered order");
// 在已交付訂單狀態(tài)下的取消邏輯
// ...
order.setState(new CancelledState()); // 切換狀態(tài)
}
}
// 具體狀態(tài)類 - 取消訂單
class CancelledState implements OrderState {
public void processOrder(Order order) {
System.out.println("Cannot process cancelled order");
// 取消訂單狀態(tài)下不執(zhí)行任何處理邏輯
}
public void cancelOrder(Order order) {
System.out.println("Cannot cancel already cancelled order");
// 取消訂單狀態(tài)下不執(zhí)行任何取消邏輯
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Order order = new Order();
order.process(); // 處理新訂單
order.process(); // 處理已發(fā)貨訂單
order.cancel(); // 取消已發(fā)貨訂單
order.process(); // 處理已交付訂單
}
}
上述示例中,我們模擬了一個電商系統(tǒng)中的訂單狀態(tài)變化過程。訂單類 Order
是擁有狀態(tài)的對象,它根據當前狀態(tài)來執(zhí)行相應的操作。
抽象狀態(tài)類 OrderState
定義了兩個方法 processOrder()
和 cancelOrder()
,具體狀態(tài)類 NewState
、ShippedState
、DeliveredState
和 CancelledState
實現了該接口,并分別負責定義相應狀態(tài)下的具體行為。
在 Main
類的 main
方法中,我們創(chuàng)建了一個訂單對象,并通過連續(xù)調用 process()
方法和 cancel()
方法來模擬訂單狀態(tài)的變化。初始狀態(tài)為新訂單狀態(tài),調用 process()
方法后會切換到已發(fā)貨訂單狀態(tài),再次調用 cancel()
方法后會切換到取消訂單狀態(tài),最后再次調用 process()
方法會輸出無法處理已取消訂單的提示信息。文章來源:http://www.zghlxwxcb.cn/news/detail-695552.html
通過使用狀態(tài)模式,訂單對象能夠根據不同的狀態(tài)來改變其行為,避免了大量的條件判斷語句,并使得代碼更加可擴展和易維護。狀態(tài)模式也能夠幫助我們將對象的狀態(tài)與行為進行解耦,使得代碼更加靈活和可復用。文章來源地址http://www.zghlxwxcb.cn/news/detail-695552.html
到了這里,關于【設計模式】用Java實現狀態(tài)模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!