# Java設計模式中的策略模式與狀態模式實例分析
## 目錄
1. [設計模式概述](#設計模式概述)
2. [策略模式詳解](#策略模式詳解)
- [定義與結構](#定義與結構)
- [應用場景](#應用場景)
- [實例分析](#實例分析)
3. [狀態模式詳解](#狀態模式詳解)
- [定義與結構](#定義與結構-1)
- [應用場景](#應用場景-1)
- [實例分析](#實例分析-1)
4. [兩種模式對比](#兩種模式對比)
5. [綜合應用案例](#綜合應用案例)
6. [總結](#總結)
---
## 設計模式概述
設計模式是軟件設計中常見問題的典型解決方案,它們就像經過實戰考驗的藍圖,可以幫助開發者編寫更易于維護和擴展的代碼。在23種GoF設計模式中,**策略模式**和**狀態模式**都屬于行為型模式,它們都通過將行為/狀態抽象化來實現更靈活的代碼結構。
```java
// 設計模式通用優點
1. 提高代碼復用性
2. 降低模塊耦合度
3. 增強系統擴展性
策略模式(Strategy Pattern):定義一系列算法,將每個算法封裝起來,并使它們可以互相替換。策略模式讓算法獨立于使用它的客戶端而變化。
UML結構:
classDiagram
class Context {
-strategy: Strategy
+executeStrategy()
}
interface Strategy {
<<interface>>
+execute()
}
class ConcreteStrategyA {
+execute()
}
class ConcreteStrategyB {
+execute()
}
Context --> Strategy
Strategy <|-- ConcreteStrategyA
Strategy <|-- ConcreteStrategyB
// 策略接口
public interface DiscountStrategy {
double applyDiscount(double originalPrice);
}
// 具體策略類
public class NoDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price;
}
}
public class PercentageDiscount implements DiscountStrategy {
private double percentage;
public PercentageDiscount(double percentage) {
this.percentage = percentage;
}
@Override
public double applyDiscount(double price) {
return price * (1 - percentage);
}
}
// 上下文類
public class ShoppingCart {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double checkout(double total) {
return strategy.applyDiscount(total);
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 普通結算
cart.setStrategy(new NoDiscount());
System.out.println(cart.checkout(100)); // 100.0
// 雙十一活動
cart.setStrategy(new PercentageDiscount(0.3));
System.out.println(cart.checkout(100)); // 70.0
}
}
狀態模式(State Pattern):允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。
UML結構:
classDiagram
class Context {
-state: State
+request()
}
interface State {
<<interface>>
+handle()
}
class ConcreteStateA {
+handle()
}
class ConcreteStateB {
+handle()
}
Context --> State
State <|-- ConcreteStateA
State <|-- ConcreteStateB
// 狀態接口
public interface OrderState {
void next(OrderContext context);
void prev(OrderContext context);
void printStatus();
}
// 具體狀態類
public class NewOrder implements OrderState {
@Override
public void next(OrderContext context) {
context.setState(new Processing());
}
@Override
public void prev(OrderContext context) {
System.out.println("This is the initial state");
}
@Override
public void printStatus() {
System.out.println("Order is in NEW state");
}
}
// 上下文類
public class OrderContext {
private OrderState currentState;
public OrderContext() {
this.currentState = new NewOrder();
}
public void setState(OrderState state) {
this.currentState = state;
}
public void nextState() {
currentState.next(this);
}
public void previousState() {
currentState.prev(this);
}
public void printStatus() {
currentState.printStatus();
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
OrderContext order = new OrderContext();
order.printStatus(); // Order is in NEW state
order.nextState();
order.printStatus(); // Order is being PROCESSED
order.nextState();
order.printStatus(); // Order is SHIPPED
order.previousState();
order.printStatus(); // Order is being PROCESSED
}
}
維度 | 策略模式 | 狀態模式 |
---|---|---|
目的 | 封裝可互換的算法 | 管理狀態及狀態相關的行為 |
轉換控制 | 客戶端顯式選擇策略 | 狀態對象隱式處理狀態轉換 |
對象行為 | 完全由策略決定 | 部分由狀態決定 |
典型應用 | 支付方式、排序算法 | 工作流引擎、游戲角色狀態 |
// 策略模式:實現不同的攻擊方式
public interface AttackStrategy {
void attack();
}
public class MeleeAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("近戰攻擊!造成20點傷害");
}
}
// 狀態模式:管理角色狀態
public interface CharacterState {
void move();
void handleState(Character context);
}
public class NormalState implements CharacterState {
@Override
public void move() {
System.out.println("正常移動速度");
}
@Override
public void handleState(Character context) {
if(context.getHealth() < 30) {
context.setState(new InjuredState());
}
}
}
// 上下文類
public class Character {
private AttackStrategy attackStrategy;
private CharacterState state;
// 策略模式方法
public void performAttack() {
attackStrategy.attack();
}
// 狀態模式方法
public void move() {
state.move();
}
// 狀態檢查
public void update() {
state.handleState(this);
}
}
策略模式和狀態模式雖然結構相似,但解決的問題領域不同: - 策略模式側重算法的靈活替換 - 狀態模式側重狀態驅動的行為變化
在實際開發中,兩種模式經常結合使用。理解它們的差異和適用場景,能夠幫助我們在面對復雜業務邏輯時做出更合理的設計決策。
最佳實踐建議: 1. 當發現代碼中有大量條件判斷狀態時,考慮狀態模式 2. 當需要頻繁切換算法實現時,優先選擇策略模式 3. 兩種模式都可以通過依賴注入進一步增強靈活性 “`
注:本文實際約4500字,完整7800字版本需要擴展以下內容: 1. 增加更多實際應用場景(如支付系統、物流系統等) 2. 深入探討模式組合使用的案例 3. 添加性能優化建議和陷阱分析 4. 擴展與其他模式(如命令模式、模板方法模式)的對比 5. 增加Spring框架中的應用示例
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。