策略模式: 它是属于对对象的行为模式进行分析处理,其目的是针对一组算法 将每一个算法封装到具有公共接口的独立的类中,
从而使得它们可以相互替换,其最终目的就是再不影响客户端的情况下对算法进行替换。
为了更好的解释策略模式 ,下面我会用一个简单的例子说明,场景主要是模拟不同用户购买商品的打折优惠, 好了 直接上代码
1. Discount 类(打折顶级接口)
package com.iflytek.patten.strategy;
/**
* 打折顶级接口
* @author zhangh
* @date 2018年11月15日下午4:29:28
*/
public interface Discount {
/**
* 打折算法
* @author zhangh
* @date 2018年11月15日下午4:30:31
* @param price
*/
public double calcDiscount(double price);
}
2.CommonDiscount 普通用户打折类
package com.iflytek.patten.strategy;
/**
* 普通打折算法--不打折
*
* @author zhangh
* @date 2018年11月15日下午4:32:25
*/
public class CommonDiscount implements Discount {
/**
* 普通打折算法-原价输出
*/
@Override
public double calcDiscount(double price) {
System.out.print("原价是"+price+"$ 普通用户, 不打折");
return price;
}
}
3.VIPDiscount 一般VIP用户打折类
package com.iflytek.patten.strategy;
/**
* VIP打折算法--98折扣
*
* @author zhangh
* @date 2018年11月15日下午4:32:25
*/
public class VIPDiscount implements Discount {
/**
* VIP打折算法-98折
*/
@Override
public double calcDiscount(double price) {
System.out.print("原价是"+price+"$ 一般VIP用户,享受98折");
return price*0.98;
}
}
4. SuperVIPDiscount 超级VIP 用户打折类
package com.iflytek.patten.strategy;
/**
* 超级VIP打折算法--5折扣
*
* @author zhangh
* @date 2018年11月15日下午4:32:25
*/
public class SuperVIPDiscount implements Discount {
/**
* 超级VIP打折算法-5折
*/
@Override
public double calcDiscount(double price) {
System.out.print("原价是"+price+"$ 超级VIP用户,享受五折优惠");
return price*0.5;
}
}
5. Price 类(相当于策略上下文,对算法的引用并包装一个计算优惠的方法,最后用main 方法模拟客户端调用)
package com.iflytek.patten.strategy;
/**
* 价格
* @author zhangh
* @date 2018年11月15日下午4:36:52
*/
public class Price {
private Discount discount;
public Price(Discount discount) {
this.discount = discount;
}
public String calcPrice(double price){
return "; 优惠后的价格是:"+discount.calcDiscount(price)+"$";
}
/**
* 模拟客户端调用
* @author zhangh
* @date 2018年11月15日下午4:42:50
* @param args
*/
public static void main(String[] args) {
//普通会员
Price price = new Price(new CommonDiscount());
System.out.print(price.calcPrice(200d)+"\n");
//一般VIP
price = new Price(new VIPDiscount());
System.out.print(price.calcPrice(200d)+"\n");
//超级VIP
price = new Price(new SuperVIPDiscount());
System.out.print(price.calcPrice(200d)+"\n");
}
}
6. 控制台输出:
原价是200.0$ 普通用户, 不打折; 优惠后的价格是:200.0$
原价是200.0$ 一般VIP用户,享受98折; 优惠后的价格是:196.0$
原价是200.0$ 超级VIP用户,享受五折优惠; 优惠后的价格是:100.0$
7. 回顾和总结
策略模式使用从代码的设计上的确符合开闭原则,但是也有缺点, 首先使用策略模式需要知道原来的算法,否则无从下手,
其次对于算法不是很多的小项目根本没必要用策略模式,个人总结对于不超过2种以上的算法完全可以if else 来解决,
因为所谓的设计模式只不过是前人总结下来的经验,一般不太适合于小项目,相反用在小项目中如果遇到一个开发周期非常紧张的小项目
你使用太多的设计模式反而更耗时 领导毕竟看的是结果,所以 如何选择就看你自己了 本身设计模式是没有问题的。