秒懂策略模式--简单明了的例子

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);
    }
}

 

posted @ 2018-07-31 17:34  小宝的进化之路  阅读(3057)  评论(0编辑  收藏  举报