1.
策略模式将行为和环境隔离开来,环境角色类负责维持和查询行为的类,各种类似的逻辑算法都在各个具体的策略类中进行实现,由于环境和行为隔离开来,所以行为的逻辑变更不会影响到环境和客户端。
2.uml类图:
这个模式涉及到三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
3.代码结构截图:(代码不多,耐心看完)
4.代码如下:
abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。 需要注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。 凡是抽象类,就一定会是某个类的父类!否则,这个抽象类的存在没有意义,因为抽象类不能被实例化。 既然抽象类一定是某一个类的父类,所以,这个抽象类一定要有构造函数!这样,抽象类的子类才能成功实例化。 抽象类也有构造函数,只是,这个构造函数是给子类提供的。所以如果抽象类继承其他类,那么抽象类的构造函数也会使用super语句,所以被继承类也必须有对外提供的构造函数
public abstract class Strategy { //定义抽象策略的方法 public abstract int strategy(int a, int b);//假如这是一种支付业务,支付策略有4种}
public class Context { //持有抽象策略角色的引用,用于客户端调用 private Strategy strategy;//获得策略类 public Strategy getStrategy() { return strategy; } //设置所需策略 public void setStrategy(Strategy strategy) { this.strategy = strategy; } //根据设置的策略类返回对应的结果 public int getResult(int a, int b) { return strategy.strategy(a, b); }}
public class Client { public static void main(String[] args) { Context context = new Context(); int result; context.setStrategy(new StrategySecond()); result = context.getResult(1, 2); System.out.println("Second: "+result); context.setStrategy(new StrategyOne()); result =context.getResult(4, 3); System.out.println("One: "+result); context.setStrategy(new StrategyThird()); result = context.getResult(5, 5); System.out.println("Third: "+result); context.setStrategy(new StrategyFourth()); result = context.getResult(6, 6); System.out.println("Fourth: "+result); }}
public class StrategyOne extends Strategy { public int strategy(int a, int b) { //无卡支付方式 return a + b*2;//此处写相关业务代码 }}public class StrategySecond extends Strategy { //会员支付方式 public int strategy(int a, int b) { return a+b;//此处写相关业务代码 } }public class StrategyThird extends Strategy {//applePay支付 public int strategy(int a,int b) { return a+b*3;//此处写相关业务代码 } }public class StrategyFourth extends Strategy { public int strategy(int a,int b) { //某某支付方式 return a+b*4;//此处写相关业务代码 } }