设计模式-策略模式

           最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要。有的时候代码的可维护、可重用、可扩展确实胜过单纯的算法效率高。所以拾起大牛书籍《大话设计模式》同时参考网上诸大牛的博客,开始我的设计模式之旅。

        今天先介绍一下策略模式。

概念:

       定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变换不会想象到使用算法的客户。

流程:

      第一步:抽象策略角色(策略类,通常由一个接口或者抽象类实现)
      第二步:具体策略角色(实现相关的算法和行为的具体类)

      第三步:环境角色(持有一个策略类的引用,最终给客户端调用)

优缺点:   

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


 

你可能感兴趣的:(java,设计模式,策略模式)