设计模式之策略模式
本文最后更新于372 天前,其中的信息可能已经过时,如有错误请发送邮件到2192492965@qq.com

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户。这种模式通常用于替代大量的
if-else 或 switch-case 语句,使得代码更加灵活和可维护。

组成部分:

  • Strategy Interface:定义所有支持的算法的公共接口。
  • Concrete Strategies:实现策略接口的具体算法。
  • Context:使用策略接口来调用具体的算法。

实现步骤

  1. 定义策略接口:这个接口规定了所有策略类必须实现的方法。
  2. 实现具体策略:为每种算法实现一个策略类。
  3. 创建上下文环境:上下文环境使用策略接口来调用具体的策略。
  4. 配置和使用:在运行时动态地配置上下文环境使用的具体策略。

普通策略模式的实现

// 接口
public interface Strategy {
    void execute();
}
// 实现
// A
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("这里是策略A");
    }
}
// B
public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("这里是策略B");
    }
}
// 策略上下文
public class Context {
    private Strategy strategy;

    public Context(ConcreteStrategyA strategy) {
        this.strategy = strategy;
    }

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

    public void executeStrategy() {
        strategy.execute();
    }
}
// 测试
public class Main {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA());
        context.executeStrategy();
        context.setStrategy(new ConcreteStrategyB());
        context.executeStrategy();

    }
}

动态策略模式的实现

动态策略模式可以融入Map和枚举,以实现可以通过策略上下文动态调用策略,也可以方便的维护程序
策略接口和普通实现无异

如果要添加策略,可以先向策略枚举中添加枚举元素,再将具体的策略实现类放入策略上下文的Map中

// 策略枚举
public enum StrategyEnum {
    STRATEGY_A,
    STRATEGY_B;

    StrategyEnum() {
    }
}
// 动态策略上下文
public class DynamicContext {

    private static final Map<StrategyEnum, Strategy> strategyMap = new HashMap<StrategyEnum, Strategy>() {{
        put(StrategyEnum.STRATEGY_A, new ConcreteStrategyA());
        put(StrategyEnum.STRATEGY_B, new ConcreteStrategyB());
    }};

    public static void execute(StrategyEnum strategyName) {
        Strategy strategy = strategyMap.get(strategyName);
        strategy.execute();
    }
}

使用起来也非常方便,

public class Main {
    public static void main(String[] args) {
        // 动态策略模式
        DynamicContext.execute(StrategyEnum.STRATEGY_A);
        DynamicContext.execute(StrategyEnum.STRATEGY_B);
    }
}
如果觉得本文对您有所帮助,可以支持下博主,一分也是缘?
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
隐藏
换装