浅谈设计模式之策略模式
什么是策略模式
策略模式是指针对同一个行为定义不同的算法(或者操作),而且这些算法都可以相互替换,对于使用者来说可以不关心具体的算法实现,让算法独立于使用它的客户。
举例说明
需求
假如我们有一个会员系统系统,同一间商品不同的会员等级有不同的会员折扣,比如:
- 钻石会员:8折
- 铂金会员:8.5折
- 黄金会员:9折
- 白银会员:9.5折
- 普通会员:不打折
类图
代码实现
具体商品iphone类:
public class Iphone {
private BigDecimal price;
private MemberStrategy strategy;
public Iphone(BigDecimal price, MemberStrategy strategy) {
this.price = price;
this.strategy = strategy;
}
public BigDecimal getPrice() {
return this.price;
}
/**
* 会员价
*
* @return
*/
public BigDecimal getMemberPrice() {
return strategy.calePrice(this.price);
}
}
会员策略接口:
public interface MemberStrategy {
/**
* 计算金额
*
* @return
*/
BigDecimal calePrice(BigDecimal price);
}
钻石会员策略:
public class DiamondMemberStrategy implements MemberStrategy{
@Override
public BigDecimal calePrice(BigDecimal price) {
return price.multiply(new BigDecimal("0.8")).setScale(2);
}
}
铂金会员策略:
public class PlatinumMemberStrategy implements MemberStrategy{
@Override
public BigDecimal calePrice(BigDecimal price) {
return price.multiply(new BigDecimal("0.85")).setScale(2);
}
}
黄金会员策略:
public class GoldMemberStrategy implements MemberStrategy{
@Override
public BigDecimal calePrice(BigDecimal price) {
return price.multiply(new BigDecimal("0.9")).setScale(2);
}
}
白银会员策略:
public class SilverMemberStrategy implements MemberStrategy{
@Override
public BigDecimal calePrice(BigDecimal price) {
return price.multiply(new BigDecimal("0.95")).setScale(2);
}
}
普通会员策略:
public class CommonMemberStrategy implements MemberStrategy {
@Override
public BigDecimal calePrice(BigDecimal price) {
return price;
}
}
客户端测试类:
public class Client {
public static void main(String[] args) {
MemberStrategy strategy = new DiamondMemberStrategy();
Iphone iphone = new Iphone(new BigDecimal("5200"), strategy);
System.out.println("iphone原价:" + iphone.getPrice() + " 会员价:" + iphone.getMemberPrice());
}
}
运行结果:
iphone原价:5200 会员价:4160.00
我们换成黄金会员策略再看看运行结果:
public class Client {
public static void main(String[] args) {
MemberStrategy strategy = new GoldMemberStrategy();
Iphone iphone = new Iphone(new BigDecimal("5200"), strategy);
System.out.println("iphone原价:" + iphone.getPrice() + " 会员价:" + iphone.getMemberPrice());
}
}
运行结果:
iphone原价:5200 会员价:4680.00
总结
从以上的代码我可以发现,使用策略模式之后可以让具体的算法变得更加的灵活,用以上的例子我们可以根据当前登录的用户对象是什么样的会员等级,创建出不同的价格策略出来;这样不管是同一个人的会员等级变化了还是不同的人有不同的等级都可以不用改这段代码。可能有些人会说那new出策略对象的地方又要加上会员等级的判断啊?这个我们可以通过一张配置表来实现,比如有这么一张二维表:
会员等级 | 策略类路径 |
---|---|
钻石会员 | DiamondMemberStrategy |
铂金会员 | PlatinumMemberStrategy |
黄金会员 | GoldMemberStrategy |
白银会员 | SilverMemberStrategy |
普通会员 | CommonMemberStrategy |
通过以上的配置我们可以通过反射机制直接将对应的策略new出来,这样我们只关心数据库中会员等级是什么,而不用关心会员对应的折扣算法是什么,这边的代码也永远都不需要改动,新增了会员等级或者改算法只要新增或者修改具体算法即可
测试类修改如下:
public class Client {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//假设这个是根据当前用户等级从数据库中读取出来
String strategyClass = "com.wenyiru.dp.strategy.PlatinumMemberStrategy";
MemberStrategy strategy = (MemberStrategy) Class.forName(strategyClass).newInstance();
Iphone iphone = new Iphone(new BigDecimal("5200"), strategy);
System.out.println("iphone原价:" + iphone.getPrice() + " 会员价:" + iphone.getMemberPrice());
}
}
运行结果:
iphone原价:5200 会员价:4420.00
大功告成,策略模式就跟大家分享到这里,欢迎大家拍砖,觉得不错的可以点个赞!!O(∩_∩)O哈哈~