秒懂策略模式--简单明了的例子
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 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;//此处写相关业务代码
}
}
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(1, 2); System.out.println("One: "+result); context.setStrategy(new StrategyThird()); result = context.getResult(1, 2); System.out.println("Third: "+result); context.setStrategy(new StrategyFourth()); result = context.getResult(1, 2); System.out.println("Fourth: "+result); } }