六、策略模式
程序员文章站
2022-08-04 08:53:30
策略模式 一、什么是策略模式 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 策略模式(Strategy) ,定义了一组算法,将每个算法都封装起来,并且 ......
策略模式
一、什么是策略模式
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式(strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
uml结构图如下:
其中,context是上下文,维护了一个对strategy对象的引用;strategy是策略类,用于定义所有支持算法的公共接口;concretestrategy是具体策略类,封装了具体的算法或行为,继承于strategy。
1. context上下文
context上下文角色,也叫context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
public class context { strategy strategy; public context(strategy strategy) { this.strategy = strategy; } //上下文接口 public void contextinterface() { strategy.algorithminterface(); } }
2. 策略角色
抽象策略角色,是对策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。algorithm是“运算法则”的意思。
public abstract class strategy { //算法方法 public abstract void algorithminterface(); }
3. 具体策略角色
用于实现抽象策略中的操作,即实现具体的算法,下方用print代替。测试类共3个concretestrategy,其它两个类与concretestrategya同理,就不再赘述了。
public class concretestrategya extends strategy { @override public void algorithminterface() { system.out.println("算法a实现"); } }
4. client客户端
下面依次更换策略,测试一下策略模式。
public class client { public static void main(string[] args) { context context; context = new context(new concretestrategya()); context.contextinterface(); context = new context(new concretestrategyb()); context.contextinterface(); context = new context(new concretestrategyc()); context.contextinterface(); } } /**测试结果 算法a实现 算法b实现 算法c实现 */
二、策略模式的应用及优缺点
应用场景
- 多个类只有算法或行为上稍有不同的场景
- 算法需要*切换的场景
- 需要屏蔽算法规则的场景
优点:
- 算法可以*切换
- 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
- 扩展性良好,增加一个策略只需实现接口即可
缺点:
- 策略类数量会增多,每个策略都是一个类,复用的可能性很小
- 所有的策略类都需要对外暴露
三、策略模式案例
我们来模拟一个下班回家的场景,需要自己选择不同的交通工具来回家
1、上下文类
首先声明一个travelcontext对象,通过构造方法,传入具体的交通工具。
public class travelcontext { private vehicle vehicle; public travelcontext(vehicle vehicle){ this.vehicle = vehicle; } public void gohome(){ if (vehicle!=null){ vehicle.travel(); } } }
2、交通工具抽象类
public interface vehicle { void travel(); }
3、不同的交通工具类
public class bus implements vehicle { public void travel() { system.out.println("乘坐巴士"); } } public class car implements vehicle { public void travel() { system.out.println("乘坐小汽车"); } } public class taxi implements vehicle { public void travel() { system.out.println("乘坐出租车"); } }
4、client客户端
下面写一个简单的程序测试一下上方编写的代码。
public class client { public static void main(string[] args) { travelcontext travelcontext = null; system.out.println("请选择回家乘坐的交通工具:1.小汽车 2.出租车 3.巴士"); scanner scanner = new scanner(system.in); int input = scanner.nextint(); switch (input){ case 1: travelcontext = new travelcontext(new car()); travelcontext.gohome(); break; case 2: travelcontext = new travelcontext(new taxi()); travelcontext.gohome(); break; case 3: travelcontext = new travelcontext(new bus()); travelcontext.gohome(); break; default: system.out.println("请输入1/2/3"); break; } } } /**测试结果 请选择回家乘坐的交通工具:1.小汽车 2.出租车 3.巴士 3 乘坐巴士 */