策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
1.Strategy:策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略,实现定义的策略。
2.ConcreteStrategy:具体的策略实现,也就是具体的算法实现。
3.Context:上下文,负责与具体的策略交互,通常上下文会持有一个真正的策略实现。
策略模式是把一个类中经常改变或者将来可能改变的部分提取出来作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
策略模式优点:
1.算法可以自由切换。
2.避免使用多重条件判断。
3.扩展性良好。
策略模式缺点:
1.策略类会增多。
2.所有策略类都需要对外暴露。
适用场景:
1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2.一个系统需要动态地在几种算法中选择一种。
3.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
//策略接口,计算购车总金额
interface Strategy {
int calPrice(int price,int num);
}
//购买5辆及以下不打折
class Nodiscount implements Strategy {
@Override
public int calPrice(int price, int num) {
return price * num;
}
}
//购买6-10辆打9.5折
class Disount1 implements Strategy {
@Override
public int calPrice(int price, int num) {
return (int)(price * num * 0.95);
}
}
//购买11-20辆打9折算法实现
class Discount2 implements Strategy {
@Override
public int calPrice(int price, int num) {
return (int) (price * num * 0.9);
}
}
//购买20辆以上打8.5折算法实现
class Discount3 implements Strategy {
@Override
public int calPrice(int price, int num) {
return (int) (price * num * 0.85);
}
}
//上下文,根据不同策略来计算购车总金额
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int calPrice(int price, int num) {
//计算价格算法
return strategy.calPrice(price, num);
}
}
public class Main {
//每辆车单价10000
public static void main(String[] args) {
Strategy strategy;
Context context;
//计算购买3辆总金额
strategy = new Nodiscount();
context = new Context(strategy);
System.out.println("购买3辆总金额: " + context.calPrice(10000,3));
//计算12辆总金额
strategy = new Discount2();
context = new Context(strategy);
System.out.println("购买12辆总金额: " + context.calPrice(10000,12));
strategy = new Discount3();
context = new Context(strategy);
System.out.println("购买30辆总金额: " + context.calPrice(10000,30));
}
}
购买3辆总金额: 30000
购买12辆总金额: 108000
购买30辆总金额: 255000