秒懂策略模式--简单明了的例子
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);
}
}


浙公网安备 33010602011771号