前面讲动态代理的时候有提到策略模式,在Spring中用到了两种代理方式,一个是JDK动态代理一个是CGLib代理,那到底Spring使用哪种代理创建代理呢?这里就用到了策略模式,由ProxyFactoryBean这个类来决定使用哪种策略,下面看看策略模式是怎么样的一个东西吧。
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
以上类图和定义来自百度百科
结合定义与类图我们可以知道,策略模式有一个策略接口(strategy),下面有许多策略实现类,分别都是不同的策略不同的算法,也就是定义上说的定义一系列算法,并把每一个算法封装起来,然后在Context类中根据具体情况选择不同的策略(算法),这样就可以做到算法独立于使用它的客户的变化而变化了。
这里举一个去商店消费的例子,全场7折,单笔购物满500元打6折,单笔购物满1000元打5折!下面上代码。
策略接口strategy(用于计算价格)
package test;
public interface strategy {
public double calPrice(double price);
}
然后就是对策略接口的实现(三种折扣策略)
package test;
public class VIP1 implements strategy {
@Override
public double calPrice(double price) {
return (price * 0.7);
}
}
package test;
public class VIP2 implements strategy {
@Override
public double calPrice(double price) {
return (price * 0.6);
}
}
package test;
public class VIP3 implements strategy {
@Override
public double calPrice(double price) {
return (price * 0.5);
}
}
然后就是context类,这里是顾客类,根据上下文选择对应策略。
package test;
public class customer {
strategy algorithm = new VIP1();
String name;
public customer(String name) {
this.name = name;
}
public void buy(double price) {
check(price);
System.out.println(name + "购买了一件" + price + "元的商品,实收:" + algorithm.calPrice(price));
}
//根据单笔消费金额选择策略
private void check(double price) {
if(price > 500 && price < 1000) {
algorithm = new VIP2();
} else if(price > 1000) {
algorithm = new VIP3();
} else {
algorithm = new VIP1();
}
}
}
来试一试吧
package test;
public class testA {
public static void main(String[] args) {
customer zhangsan = new customer("张三");
zhangsan.buy(600);
zhangsan.buy(1200);
zhangsan.buy(200);
}
}
控制台打印
写到这里,应该对策略模式有个大致的认识了,结合之前的类图就可以发现,它可以在context上下文环境根据具体的情况来选择对应的策略,从而达到对不同消费者有不同的计算实际金额的方式(打折)。
注:由于我的水平有限,有些地方说的可能有问题?欢迎大家指出,互相讨论互相学习进步!