java-设计模式(行为型)-【策略模式】
1.策略模式(StrategyMode)
定义:属于java的行为型模式,遵循开闭原则(对扩展开放,对修改关闭),能有效减少面向过程的if-else语句,
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。
使用场景:适用于将不同的算法各自封装,用户端可以随意挑选需要的算法。
2.在线支付例子
某支付系统接入以下几种商户进行充值:假如分为四种,手机支付,网银支付,商户账号支付和点卡支付。
如下:
①网银充值,8.5折;
②商户充值,9折;
③手机充值,没有优惠;
④点卡充值,收取1%的渠道费;
3.图解

4.枚举类(支付)
//四种的支付手段
public enum PayMode {
BANK(1,"网银充值"),ACCOUNT(2,"商户充值"),MOBILE(3,"手机充值"),CARD(4,"点卡充值");
private int value;
private String mode;
PayMode(int value,String mode)
{
value=value;
mode=mode;
}
}
5.策略类
public interface Strategy {
double getSum(double money);
}
//①网银充值,8.5折;
//②商户充值,9折;
//③手机充值,没有优惠;
//④点卡充值,收取1%的渠道费;
class BankStra implements Strategy
{
@Override
public double getSum(double money) {
// TODO Auto-generated method stub
return money*0.85;
}
}
class AccountStra implements Strategy
{
@Override
public double getSum(double money) {
// TODO Auto-generated method stub
return money*0.9;
}
}
class MobileStra implements Strategy
{
@Override
public double getSum(double money) {
// TODO Auto-generated method stub
return money;
}
}
class CardStra implements Strategy
{
@Override
public double getSum(double money) {
// TODO Auto-generated method stub
return money*1.01;
}
}
6.生产策略类的工厂(单态设计模式:已经静态保存了四种策略,保证线程同步)
//策略工厂:设计为单态模式,保持线程安全,用个池保存具体策略。
class StrategyFactory
{
private static Hashtable <Integer ,Strategy> ht=new Hashtable<Integer,Strategy>();
private static StrategyFactory factory=new StrategyFactory();
private StrategyFactory()
{
}
static{
ht.put(1, new BankStra());
ht.put(2,new AccountStra());
ht.put(4,new CardStra());
ht.put(3, new MobileStra());
}
public static StrategyFactory getInstance()
{
return factory;
}
public Strategy getStrategy(int value)
{
return ht.get(value);
}
}
7.场景类:根据用户的不同要求使用不同的策略
public class Context {
//计算指定支付方式的费用
public double getReCharge(int value, double money) {
// TODO Auto-generated method stub
Strategy strat=StrategyFactory.getInstance().getStrategy(value);
return strat.getSum( money);
}
}
8.测试
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Context context=new Context();
double charge=context.getReCharge(1, 100);
System.out.println(charge);
double charge2=context.getReCharge(2, 100);
System.out.println(charge2);
}
}
9.运行结果
85.0 90.0

浙公网安备 33010602011771号