策略模式
策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们可以相互替换。
策略模式让算法独立于使用它的客户而独立变化。
具体角色
1:Strategy(抽象策略类):
定义一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法。抽象策略类一般使用接口或抽象类实现。
2:Context(应用场景):
需要使用ConcreteStrategy提供的算法,内部维护一个Strategy的实例,负责动态设置运行时Strategy具体实现的算法,负责跟Strategy的交互与传递。
3:ConcreteStrategy(具体策略类):
实现Strategy定义的接口,提供具体的算法实现。
UML模型图
例:
需求:
现商场计算总额,已知有几种不同的活动类型:正常,打折,满减。
实现思路:
客户端输入总额,并选择相应的活动进行总额计算。
服务器端提供相应的算法实现,由客户端进行具体的算法实例创建。算法的实现具体细节对客户端是封装的。
代码实现
抽象策略类:
/**
* *策略模式
* *抽象策略角色:活动接口
*/
public interface CashStrategy {
/**
* 返回经过活动之后的金额
* @param money
* @return
*/
double acceptCash( double money );
}
具体实现策略类:
/**
* ---策略模式---
* 具体实现策略:打折返回子类
*
*/
public class CashSale implements CashStrategy{
private double sale;
/**
* @param sale 折扣
*/
public CashSale(double sale){
this.sale=sale;
}
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money*sale;
}
}
/**
* ---策略模式---
* 具体实现策略:正常返回子类
*/
public class CashNoramal implements CashStrategy{
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money;
}
}
/**
* ---策略模式---
* 具体实现策略:满减活动实现类
*
*/
public class CashFullMinus implements CashStrategy{
private double full;
private double minus;
/**
* @param full 满额
* @param minus 减额
*/
public CashFullMinus( double full,double minus) {
// TODO Auto-generated constructor stub
this.full=full;
this.minus=minus;
}
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
if (money>=full) {
money=money-minus;
}
return money;
}
}
应用环境实现类
/**
* ---策略模式---
* 环境角色:策略类的应用
*/
public class CashContext {
private CashStrategy cashStrategy;
public CashContext(CashStrategy cashStrategy){
this.cashStrategy=cashStrategy;
}
public double acceptCash(double money){
return cashStrategy.acceptCash(money);
}
}
客户端调用:
public static void main(String[] args) {
double sunMoney=500;
CashContext cashContext1=new CashContext(new CashNoramal());
System.out.println(cashContext1.acceptCash(sunMoney));
CashContext cashContext2=new CashContext(new CashSale(0.7));
System.out.println(cashContext2.acceptCash(sunMoney));
CashContext cashContext3=new CashContext(new CashFullMinus(400,60));
System.out.println(cashContext3.acceptCash(sunMoney));
}