首先我们来看下策略模式的类图(设计模式的类图代表着设计思想)
策略模式 : 策略模式定义了算法家族,分别封装起来,让它们直接之间可以相互替换,此模式让算法的变化独立于使用算法的客户.
Context上下文,用具体的方法来进行配置,维护一个Strategy对象的引用.
package sjms.strategy.study;
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void excute(){
strategy.algorithm();
}
}
package sjms.strategy.study;
public abstract class Strategy {
//算法
public abstract void algorithm();
}
package sjms.strategy.study;
public class ContreteStrategyA extends Strategy {
@Override
public void algorithm() {
// 具体算法
System.out.println("ContreteStrategyA实现");
}
}
package sjms.strategy.study;
public class ContreteStrategyB extends Strategy {
@Override
public void algorithm() {
// 具体算法
System.out.println("ContreteStrategyB实现");
}
}
package sjms.strategy.study;
public class TestStrategy {
public static void main(String[] args) {
Context context = new Context();
context.setStrategy(new ContreteStrategyA());
context.excute();
}
}
实际开发中如何决定是否要用策略模式呢?
1:许多相关的类有不同的行为,也就是说所有的算法都是完成相同的工作只是实现不同.
2:进行解耦(减少各个算法之间的耦合)
3:封装了变化,对客户隐藏了策略的实现.
下面我们来走进实际的应用中
像我们玩游戏的时候都会有一些活动,类似充值100的100个元宝,另外多赠送50个元宝之类的活动
package sjms.strategy.exercise;
public class CashMoney {
private RechargeMoney rechargeMoney;
public void setRechargeMoney(RechargeMoney rechargeMoney) {
this.rechargeMoney = rechargeMoney;
}
public void cash() {
rechargeMoney.recharge();
}
}
public interface RechargeMoney {
//充值Recharge
void recharge();
}
package sjms.strategy.exercise;
public class RechargeFifty implements RechargeMoney {
@Override
public void recharge() {
System.out.println("充值50返70个元宝!");
}
}
package sjms.strategy.exercise;
public class RechargeOneHundred implements RechargeMoney {
@Override
public void recharge() {
System.out.println("充值一百返150个元宝!");
}
}
package sjms.strategy.exercise;
public class TestRechage {
public static void main(String[] args) {
CashMoney cashMoney = new CashMoney();
RechargeMoney rechargeMoney = new RechargeOneHundred();
cashMoney.setRechargeMoney(rechargeMoney);
cashMoney.cash();
}
}