看一遍就会了的策略模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式的优点:
- 开闭原则;
- 避免使用多重条件转移语句;
- 提高了算法的保密性和安全性:可使用策略模式以避免暴露复杂的,与算法相关的数据结构。
策略模式体现了面向对象程序设计中非常重要的两个原则:
- 封装变化的概念。
- 编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
案例: 用户购物(会员与非会员)
会员与非会员 购买东西时付款会有不同 ,用户出示会员卡,价格会有所优惠
先看下不使用策略模式结局问题
public enum Role {
VIP,
COMMON;
}
public class Test {
public static void main(String[] args) {
Role role = Role.VIP;
int price = 100;
switch (role) {
case VIP:
price *= 0.3;
break;
case COMMON:
price *=0.8;
break;
}
System.out.println(price);
}
}
以上看着挺简单的,根本不需要用啥设计模式写,但是当业务复杂一点,有很多的角色时,这样switch 会不会有点麻烦了呢
接下来看看使用策略模式来写
先定义一个抽象的策略角色
public interface Strategy {
// 定义 一个方法
int count(int price);
}
在具体的角色去实现这个策略角色
// vip 用户
public class VipStrategy implements Strategy {
@Override
public int count(int price) {
return (int) (price*0.3);
}
}
// 普通用户
public class CommonStrategy implements Strategy {
@Override
public int count(int price) {
return (int) (price * 0.8);
}
}
定义一个策略操作的类
public class Context {
// 策略对象
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//调用策略方法
public int count(int price) {
return strategy.count(price);
}
}
测试类
public class Test {
public static void main(String[] args) {
Context context = new Context(new VipStrategy());
int count = context.count(100);
System.out.println(count);
Context commonContext = new Context(new CommonStrategy());
int commonCount = commonContext.count(100);
System.out.println(commonCount);
}
}