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