Java设计模式(15)——行为模式之策略模式(Strategy)

一、概述

  概念

  

  UML简图

  

  角色

  

 

二、实践

  我们先将上述的UML图的抽象情况下的代码写出,然后再给出一个具体的例子

  策略接口——当然如果有一些公共的行为,应当使用抽象类!

/**
 * 策略接口
 *
 * @author Administrator
 **/
public interface Strategy {
    void strategyMethod();
}

  具体策略实现

/**
 * 具体策略
 *
 * @author Administrator
 **/
public class ConcreteStrategy implements Strategy{
    @Override
    public void strategyMethod() {
        // 算法逻辑
    }
}

  环境

/**
 * 环境
 *
 * @author Administrator
 **/
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void contextMethod() {
        strategy.strategyMethod();
    }
    /*请勿将模式拘泥于形式
    public void method(Strategy strategy) {
        strategy.strategyMethod();
    }*/
}

   我们稍加改造,改成一个具体的计算加减法的例子

/**
 * 策略接口
 *
 * @author Administrator
 **/
public interface Strategy {
    int calc(int a, int b);
}
/**
 * 加法策略
 *
 * @author Administrator
 **/
public class PlusStrategy implements Strategy{
    @Override
    public int calc(int a, int b) {
        return a + b;
    }
}
/**
 * 减法策略
 *
 * @author Administrator
 **/
public class MinusStrategy implements Strategy{
    @Override
    public int calc(int a, int b) {
        return a- b;
    }
}
/**
 * 环境
 *
 * @author Administrator
 **/
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public int calc(int a, int b) {
       return strategy.calc(a, b);
    }
}

  这样,我们就可以在客户端通过环境调用了!

/**
 * 客户端
 * @author  Administrator
 **/
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new PlusStrategy());
        System.out.println(context.calc(1, 2));
        Context context1 = new Context(new MinusStrategy());
        System.out.println(context1.calc(2, 1));
    }
}

  当然,我们之前在Java8章节已经提到过,这样导致出现了很多实现类,单从语法层面上是可以改为拉姆达表达式的:

 public static void main(String[] args) {
        Context context = new Context((a, b)-> a+b);
        System.out.println(context.calc(2, 3));
    }

 

posted @ 2017-10-30 20:48  ---江北  阅读(226)  评论(0编辑  收藏  举报
TOP