设计模式之策略模式
前言
在日常生活中我们时常会根据环境的不同选择不同的方式去解决问题,例如我们吃饭如果是吃中餐那么 我们需要使用‘筷子’,如果我们吃西餐,那么我们需要使用‘刀叉’,筷子和刀叉可以抽象为我们所选择使用的策略用来解决我们的用餐问题。、在软件开发中我们也时常会根据业务的不同,环境的不同,客户的不同来进行各种各样的算法或者策略去解决问题。我们可能会进行大量的if else操作,这种硬编码的方式明显过于生硬,不符合面向对象编程,违背了开闭原则。
策略模式封装算法的变化,对外提供一个上下文对象用来操控业务代码的实现。
这里通过一个应用实例来深入检出的引出策略模式
策略模式的定义与特点
策略(Strategy) 模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
商场的促销活动
**商场时不时的会搞出来一些促销活动,类似于打折,满减,送优惠券等等。
实现代码如下:
抽象策略类
public interface Strategy{
void cash();
}
具体策略类
//打折
public class Strategy_dz implements Strategy{
public void cash(){
System.out.println("》》》》》打折促销")
}
}
//满减
public class Strategy_mj implements Strategy{
public void cash(){
System.out.println("》》》》》满500减200")
}
}
//送优惠券
public class Strategy_yhj implements Strategy{
public void cash(){
System.out.println("》》》》》一张百元优惠券")
}
}
上下文环境类
public class StrategyContext{
private Strategy strategy;
public StrategyContext(Integer type){
switch (type) {
//打折
case 0:
strategy=new Strategy_dz ();
break;
//满减
case 1:
strategy=new Strategy_mj ();
break;
//送优惠券
case 2:
strategy=new Strategy_yhj ();
break;
}
}
public void cash(Integer type){
strategy.cash();
}
}
测试类
public static void main(String[] args) {
StrategyContext sc=new StrategyContext(0);
sc.cash();
}
该例子中使用了策略模式+简单工厂模式实现了将算法封装,客户端只需要关注上下文环境类的使用即可。