2023年了还有人不会策略模式?

一、什么是策略模式?

  策略模式是一种行为设计模式,它使得你能在一个上下文对象中动态地切换不同的算法或行为。策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端。

  在策略模式中,我们创建了一个抽象策略类(Strategy),这个类定义了所有策略应该具有的接口。然后,我们为每种策略创建了一个具体的实现类。客户端根据当前的情况选择一个具体的策略。

二、代码

抽象策略类

public interface Strategy {
     void execute();
}

 

策略实现类

public class StrategyA implements Strategy{
    @Override
    public void execute() {
        System.out.println("使用算法A");
    }
}

public class StrategyB implements Strategy{
    @Override
    public void execute() {
        System.out.println("使用算法B");
    }
}

public class StrategyC implements Strategy{
    @Override
    public void execute() {
        System.out.println("使用算法C");
    }
}

 

上下文类

public class Context {
    private Strategy strategy;

    public void executeStrategy() {
        this.strategy.execute();
    }

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

 

测试类

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要使用的算法:");
        String str = scanner.next();
        Context context = null;
        if (str.equals("A")) {
            context = new Context(new StrategyA());
        } else if (str.equals("B")){
            context = new Context(new StrategyB());
        } else if (str.equals("C")) {
            context = new Context(new StrategyC());
        }
        context.executeStrategy();
        scanner.close();
    }
}

 
测试结果:

请输入要使用的算法:
A
使用算法A

 上面测试类中客户端根据自己需求来使用对应的算法策略,但是要根据一系列if-else的复杂判断来使用具体的算法策略,我们可以使用简单工厂加map来优化代码。
 

简单工厂加map优化

public class StrategyFactory {
    private Map<String, Strategy> map = new HashMap<>();

    public StrategyFactory() {
        map.put("A",new StrategyA());
        map.put("B",new StrategyA());
        map.put("C",new StrategyC());
    }

    public Strategy getStrategy(String type) {
       return map.get(type);
    }

}

 

优化后的测试类

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        StrategyFactory factory = new StrategyFactory();
        Context context = new Context(factory.getStrategy(str));
        context.executeStrategy();
        scanner.close();
    }
}

 

三、总结

策略模式优点:
1.避免了多重条件判断增加系统的复杂性
2.算法独立于客户端,算法的修改不会影响到客户端代码
3.将算法封装在独立的Stratygy中,易于扩展和切换,符合开闭原则

策略模式缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2.会造成很多的策略类。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值