基本要点
1、定义:策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法
2、本质:分离算法,选择实现
3、举例:我们开了一家手机专卖店,对于不同的客人,我们有不同的报价策略
新客人,小批量购机,我们原价
新客人,大批量购机,我们打9折
老客人,小批量购机,我们打85折
老客人,大批量购机,我们打8折
虽然我们可以通过if/else语句进行处理,但是后续如果还有其他策略,我们就需要修改原代码,不符合我们的开闭原则,所以我们把报价设计成一个接口,对应的报价策略设计成相应的实现类,这样,即使有新的报价策略,我们只需要新增实现类即可,不需要修改原代码
4、使用场景
Spring框架中的resource接口,资源访问策略
代码样例
首先我们需要创建一个接口,后续的策略都通过实现这个接口来增加
/**
* 抽象策略类(Strategy)
*/
public interface Strategy {
double getPrice(double standardPrice);
}
/**
* 新客户小批量策略
*/
public class NewCustomerFewAmount implements Strategy{
@Override
public double getPrice(double standardPrice) {
System.out.println("新客户小批量购机,不打折");
return standardPrice;
}
}
/**
* 新客户大批量策略
*/
public class NewCustomerManyAmount implements Strategy{
@Override
public double getPrice(double standardPrice) {
System.out.println("新客户大批量购机,打九折");
return standardPrice * 0.9;
}
}
/**
* 老客户小批量策略
*/
public class OldCustomerFewAmount implements Strategy{
@Override
public double getPrice(double standardPrice) {
System.out.println("老客户小批量购机,打85折");
return standardPrice * 0.85;
}
}
/**
* 老客户大批量策略
*/
public class OldCustomerManyAmount implements Strategy{
@Override
public double getPrice(double standardPrice) {
System.out.println("老客户大批量购机,打八折");
return standardPrice * 0.8;
}
}
此外,我们还需要创建一个上下文类,来实现算法和客户端的分离
/**
* 上下文类,负责和具体的策略类进行交互
* 实现了具体算法和客户端调用的分离,使得算法可以独立于客户端独立变化
* 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同的策略对象
*/
public class Context {
// 当前采用的算法对象
private Strategy strategy;
// 可以通过构造器注入
public Context(Strategy strategy) {
this.strategy = strategy;
}
// 可以通过set方法注入
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void printPrice(double price) {
System.out.println("您的报价为:" + strategy.getPrice(price));
}
}
最后,我们在客户端进行测试
public class Client {
public static void main(String[] args) {
// 针对不同的客户和订货数量,我们需要采用不同的报价策略
Strategy strategy = new NewCustomerManyAmount();
Context context = new Context(strategy);
context.printPrice(100);
}
}
如有错误,欢迎指正
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136805.html