【HeadFirst设计模式(一)策略者模式】在软件开发中,设计模式是一种被广泛接受的解决方案,用于解决常见的设计问题。它不是具体的代码,而是一种思想或方法,帮助开发者编写更灵活、可维护和可扩展的代码。今天,我们将介绍《HeadFirst设计模式》中的第一个模式——策略者模式(Strategy Pattern)。
什么是策略者模式?
策略者模式是一种行为型设计模式,它允许你定义一系列算法,并将它们封装起来,使它们可以互相替换。换句话说,策略者模式让你可以在运行时动态地改变对象的行为。
举个简单的例子:想象一个鸭子类(Duck),它有不同的飞行方式和叫声方式。有的鸭子会飞,有的不会;有的会“嘎嘎”叫,有的会“喵喵”叫。如果我们在每个子类中都硬编码这些行为,那么当需要修改或添加新行为时,就会变得非常麻烦。这时候,策略者模式就派上用场了。
策略者模式的核心思想
策略者模式的核心思想是将变化的部分独立出来,并使用接口或抽象类进行封装。这样,即使需求发生变化,也不需要修改原有代码,只需替换相应的策略即可。
具体来说,策略者模式包含以下几个角色:
- 策略接口(Strategy):定义所有支持的算法的公共接口。
- 具体策略类(Concrete Strategies):实现策略接口的不同算法。
- 上下文类(Context):持有策略接口的引用,并通过该接口调用具体策略的方法。
示例代码:鸭子游戏
我们以一个简单的鸭子游戏为例来说明策略者模式的应用。
1. 定义策略接口
```java
interface FlyBehavior {
void fly();
}
interface QuackBehavior {
void quack();
}
```
2. 实现具体策略类
```java
class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("我用翅膀飞!");
}
}
class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("我不会飞!");
}
}
class Quack implements QuackBehavior {
public void quack() {
System.out.println("嘎嘎!");
}
}
class Squeak implements QuackBehavior {
public void quack() {
System.out.println("吱吱!");
}
}
```
3. 定义上下文类(鸭子)
```java
abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior fb) {
this.flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
this.quackBehavior = qb;
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("我会游泳!");
}
}
```
4. 具体鸭子类
```java
class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
public void display() {
System.out.println("绿头鸭!");
}
}
class RubberDuck extends Duck {
public RubberDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
public void display() {
System.out.println("橡皮鸭!");
}
}
```
5. 测试类
```java
public class Client {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.display();
mallard.performFly();
mallard.performQuack();
Duck rubberDuck = new RubberDuck();
rubberDuck.display();
rubberDuck.performFly();
rubberDuck.performQuack();
// 动态更换策略
rubberDuck.setFlyBehavior(new FlyWithWings());
rubberDuck.performFly();
}
}
```
策略者模式的优点
- 灵活性高:可以通过组合不同的策略来实现不同的行为。
- 易于扩展:新增策略时不需要修改已有代码。
- 符合开闭原则:对扩展开放,对修改关闭。
策略者模式的缺点
- 增加系统复杂度:需要引入多个类和接口,对于简单场景可能显得过于复杂。
- 策略类数量多:如果策略种类过多,管理起来可能会比较困难。
总结
策略者模式是一种非常实用的设计模式,尤其适合那些需要动态改变行为的场景。通过将算法与使用它的对象分离,我们可以让代码更加灵活、可维护性更高。在实际开发中,合理运用策略者模式,可以帮助我们构建出结构清晰、易于扩展的系统。
如果你正在学习设计模式,那么策略者模式是一个非常好的起点。它不仅能够帮助你理解面向对象设计的基本原则,还能提升你的代码质量。希望这篇文章能为你带来一些启发,也欢迎你在实际项目中尝试应用这一模式。