哇塞码农设计模式系列 -- 策略模式

更新于2024-11-05 08:00:007 分钟3 千字62691400
摘要

策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它们的客户端而变化。

以下是策略模式的一些关键角色:

  1. Context(上下文):定义了客户端感兴趣的接口,并且维护一个对策略对象的引用。通常,上下文会将客户端请求委派给策略对象。
  2. Strategy(策略):是一个接口或抽象类,定义了一系列算法的公共接口。具体的策略类实现了这个接口,提供了具体的算法实现。

UML类图

PlantUML Image

Java示例代码

// 策略接口
interface Strategy {
    void execute();
}

// 具体策略A
class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略A");
    }
}

// 具体策略B
class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略B");
    }
}

// 上下文类
class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        if (strategy != null) {
            strategy.execute();
        }
    }
}

// 测试类
public class StrategyPatternExample {
    public static void main(String[] args) {
        // 创建上下文对象
        Context context = new Context();

        // 使用策略A
        context.setStrategy(new ConcreteStrategyA());
        context.executeStrategy(); // 执行策略A

        // 使用策略B
        context.setStrategy(new ConcreteStrategyB());
        context.executeStrategy(); // 执行策略B
    }
}

策略模式和简单工厂模式结合

结合策略模式和简单工厂模式可以更灵活地管理对象的创建和选择,客户端调用时无需感知Strategy,仅感知Context即可,进一步减少耦合

// 策略接口
interface Strategy {
    void execute();
}

// 具体策略A
class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略A");
    }
}

// 具体策略B
class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略B");
    }
}

// 上下文类
class Context {
    private Strategy strategy;

    // 内部简单工厂方法,根据类型创建具体策略对象
    private static Strategy createStrategy(String strategyType) {
        if ("A".equals(strategyType)) {
            return new ConcreteStrategyA();
        } else if ("B".equals(strategyType)) {
            return new ConcreteStrategyB();
        } else {
            throw new IllegalArgumentException("Unknown strategy type: " + strategyType);
        }
    }

    // 构造方法,根据类型创建具体策略对象
    public Context(String strategyType) {
        this.strategy = createStrategy(strategyType);
    }

    public void executeStrategy() {
        if (strategy != null) {
            strategy.execute();
        }
    }
}

// 测试类
public class StrategyAndFactoryPatternExample {
    public static void main(String[] args) {
        // 创建上下文对象并设置策略类型
        Context contextA = new Context("A");
        Context contextB = new Context("B");

        // 执行策略
        contextA.executeStrategy(); // 执行策略A
        contextB.executeStrategy(); // 执行策略B
    }
}

评论区

你认为这篇文章怎么样?
  • great
    0
  • happy
    0
  • doubt
    0
  • boring
    0
  • bad
    0

0/2048