策略模式(strategy) :定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
UML类图
算法接口类CashSuper
package com.lx.strategy;
public interface CashSuper {
public double acceptCash(double cash);
}
具体算法类CashNormal
package com.lx.strategy;
public class CashNormal implements CashSuper {
public CashNormal() {
}
public double acceptCash(double cash) {
return cash;
}
}
具体算法类CashRebate
package com.lx.strategy;
public class CashRebate implements CashSuper {
private double reach;
private double discount;
public CashRebate(double reach, double discount) {
super();
this.reach = reach;
this.discount = discount;
}
public double acceptCash(double cash) {
return cash - Math.floor(cash/reach)*discount;
}
}
具体算法类CashReturn
package com.lx.strategy;
public class CashReturn implements CashSuper {
private double discount;
public CashReturn(double discount) {
super();
this.discount = discount;
}
public double acceptCash(double cash) {
return cash*discount;
}
}
上下文类 StrategyContext
package com.lx.strategy;
public class CashContext {
private CashSuper cashSuper;
public CashContext(CashSuper cashSuper) {
super();
this.cashSuper = cashSuper;
}
public double getResult(double cash){
return cashSuper.acceptCash(cash);
}
}
测试类
package com.lx.strategy;
import org.junit.Test;
public class TestStrategy {
@Test
public void normal(){
CashContext cashContext =new CashContext(new CashNormal());
double netReceipts=cashContext.getResult(100);
System.out.println("正常收费:"+netReceipts);
}
@Test
public void rebate(){
CashContext cashContext =new CashContext(new CashRebate(9d,2d));
double netReceipts=cashContext.getResult(100);
System.out.println("满9块减2块:"+netReceipts);
}
@Test
public void Return(){
CashContext cashContext =new CashContext(new CashReturn(0.88));
double netReceipts=cashContext.getResult(100);
System.out.println("88折收费:"+netReceipts);
}
}
测试结果----------------------------------------
88折收费:88.0
正常收费:100.0
满9块减2块:78.0
----------------------------------------------------