最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要。有的时候代码的可维护、可重用、可扩展确实胜过单纯的算法效率高。所以拾起大牛书籍《大话设计模式》同时参考网上诸大牛的博客,开始我的设计模式之旅。
今天先介绍一下策略模式。
概念:
定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变换不会想象到使用算法的客户。
流程:
第一步:抽象策略角色(策略类,通常由一个接口或者抽象类实现)
第二步:具体策略角色(实现相关的算法和行为的具体类)
第三步:环境角色(持有一个策略类的引用,最终给客户端调用)
优缺点:
1.优点:
(1)、使用组合替代继承,更灵活(算法独立,可以任意扩展);
(2)、客户不需要知道策略、算法的实现细节;
(3)、使用策略模式可以避免使用多重条件(if-else)语句。
2.缺点:
(1)、客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这点有同于简单工厂模式。
示例代码
package Pattern;
import java.util.Scanner;
interface Operation// 父类接口
{
public int GetResult(int opA, int opB);
}
class AddOperation implements Operation {
public int GetResult(int opA, int opB) {
return opA + opB;
}
}
class SubOperation implements Operation {
public int GetResult(int opA, int opB) {
return opA - opB;
}
}
class MulOperation implements Operation {
public int GetResult(int opA, int opB) {
return opA * opB;
}
}
class StrategyMethod {
private Operation myOperation;
public StrategyMethod(Operation tempOperation) {
myOperation = tempOperation;
}
public StrategyMethod() {
myOperation = null;
}
public int GetResult(int opA, int opB) {
return myOperation.GetResult(opA, opB);
}
}
public class Pattern {
public static void main(String[] args) {
try {
Scanner input = new Scanner(System.in);
int opA, opB, result;
opA = input.nextInt();
opB = input.nextInt();
String op = "*";
StrategyMethod strategy = new StrategyMethod();
if (op.equals("+")) {
strategy = new StrategyMethod(new AddOperation());
result = strategy.GetResult(opA, opB);
System.out.println(result);
} else if (op.equals("-")) {
strategy = new StrategyMethod(new SubOperation());
result = strategy.GetResult(opA, opB);
System.out.println(result);
} else if (op.equals("*")) {
strategy = new StrategyMethod(new MulOperation());
result = strategy.GetResult(opA, opB);
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}