策略模式
基本介绍
1.策略模式中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2.一个类的行为或其算法可以在运行时更改,创建表示各种策略的对象和一个行为随着策略对象改变而改变的 Context 对象,策略对象改变 Context 对象的执行算法
角色
1.Context:环境角色,聚合、调用 Strategy 对象,根据传入不同的 ConcreteStrategy 对象,调用不同策略
2.Strategy:抽象策略角色,接口,定义、封装算法族
3.ConcreteStrategy:具体策略角色,实现 Strategy 接口,实现具体的策略算法
事项
1.核心
(1)从不变的代码中分离变化的代码
(2)定义了策略接口,针对接口编程而不是具体类
(3)多用组合/聚合,少用继承
2.优点
(1)算法可以自由切换,动态地让一个对象在许多行为中选择一种行为
(2)避免使用多重条件判断(if else)
(3)符合开闭原则,扩展性良好
3.缺点
(1)每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大
(2)所有策略类都需要对外暴露
4.应用场景
(1)一个系统里面有许多类,之间区别仅在于行为
(2)一个系统需要动态地在几种算法中选择一种
策略模式、状态模式
1.策略模式:控制对象使用什么策略,策略是手动转换的
2.状态模式:状态模式会自动改变状态,在相关的状态类方法里面封装转换的过程,状态的改变是在状态内部发生的,在执行动作时进行自动的转换
JDK 中的 Arrays 的 Comparator
1.匿名类对象 new Comparator<Integer>() {} 实现了 Comparator 接口(策略接口)
2.public int compare(Integer o1, Integer o2) {} 指定具体的处理方式,即策略
代码示例
public class Client {//客户端
public static void main(String[] args) {
Add add = new Add();
Subtract subtract = new Subtract();
Multiply multiply = new Multiply();
Divide divide = new Divide();
Context context = new Context();
context.setStrategy(add);
context.execute();
System.out.println("Context 在 Add 策略下,result = " + context.result);
context.setStrategy(subtract);
context.execute();
System.out.println("Context 在 Subtract 策略下,result = " + context.result);
context.setStrategy(multiply);
context.execute();
System.out.println("Context 在 Multiply 策略下,result = " + context.result);
context.setStrategy(divide);
context.execute();
System.out.println("Context 在 Divide 策略下,result = " + context.result);
}
}
class Context {//环境角色
private Strategy strategy;
public int num1 = 10;
public int num2 = 5;
public int result;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {//调用策略
result = strategy.operation(num1, num2);
}
}
interface Strategy {//抽象策略角色
int operation(int num1, int num2);
}
class Add implements Strategy {//具体策略1
@Override
public int operation(int num1, int num2) {
return num1 + num2;
}
}
class Subtract implements Strategy {//具体策略2
@Override
public int operation(int num1, int num2) {
return num1 - num2;
}
}
class Multiply implements Strategy {//具体策略3
@Override
public int operation(int num1, int num2) {
return num1 * num2;
}
}
class Divide implements Strategy {//具体策略4
@Override
public int operation(int num1, int num2) {
return num1 / num2;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战