策略模式的概念
策略模式是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。这种类型的设计模式属于行为模式,它提供了一种用许多种算法代替一种算法的途径。
策略模式包含三个角色:环境(Context)角色、抽象策略(Strategy)角色和具体策略(ConcreteStrategy)角色。环境角色负责维持和查询行为类,抽象策略角色由一个接口或抽象类实现,具体策略角色则实现抽象策略接口,包装了相关的算法或行为。
策略模式的优缺点
优点:
- 算法可以自由切换:由于策略类实现自同一个接口,所以使得它们之间可以自由切换。
- 算法可以独立变化:策略模式把算法的使用放到环境类中,而算法的实现则放到具体策略类中,环境类与具体策略类之间通过抽象策略类进行耦合,这使得算法可以独立于环境类变化。
- 代码的可重用性:策略模式可以使得算法的重用性提高,因为算法被封装在独立的策略类中,可以被不同的环境类所使用。
缺点:
- 客户端必须知道所有的策略类:客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这可能会增加客户端的复杂性。
- 策略类可能会很多:如果系统中有很多不同的算法,那么就需要创建很多策略类,这可能会导致系统变得庞大而复杂。
策略模式的应用场景
- 计费系统:对于不同用户类型和消费金额采用不同的计费方式。
- 游戏开发中的角色技能系统:不同角色拥有不同技能,在游戏中可以根据角色选择相应技能进行攻击或防御。
- 商城促销活动:根据不同促销活动采取不同的优惠方式,如打折、满减等。
- 解决大量的if-else语句:例如根据不同条件选择不同的算法进行计算。
策略模式的代码实现
以下是一个简单的策略模式的代码实现示例:
// 抽象策略接口 | |
public interface Strategy { | |
int doOperation(int num1, int num2); | |
} | |
// 具体策略类:加法 | |
public class OperationAdd implements Strategy { | |
@Override | |
public int doOperation(int num1, int num2) { | |
return num1 + num2; | |
} | |
} | |
// 具体策略类:减法 | |
public class OperationSubtract implements Strategy { | |
@Override | |
public int doOperation(int num1, int num2) { | |
return num1 - num2; | |
} | |
} | |
// 环境角色 | |
public class Context { | |
private Strategy strategy; | |
public Context(Strategy strategy) { | |
this.strategy = strategy; | |
} | |
public int executeStrategy(int num1, int num2) { | |
return strategy.doOperation(num1, num2); | |
} | |
} | |
// 客户端代码 | |
public class StrategyPatternDemo { | |
public static void main(String[] args) { | |
Context context = new Context(new OperationAdd()); | |
System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); | |
context = new Context(new OperationSubtract()); | |
System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); | |
} | |
} |
在这个示例中,我们定义了一个抽象策略接口Strategy
,以及两个具体策略类OperationAdd
和OperationSubtract
,它们分别实现了加法和减法的操作。然后,我们定义了一个环境角色Context
,它持有一个策略对象的引用,并根据该策略对象执行相应的操作。最后,在客户端代码中,我们根据需要选择不同的策略对象,并通过环境角色执行相应的操作。