1. 以一個算術運算為例,傳統做法為:
java 代碼
- package org.common;
- public class Calculate {
- public String getResult(float a,float b,char c){
- float add = a+b;
- float sub = a-b;
- float mult = a*b;
- float division = a/b;
- switch(c){
- case '+':
- return "相加結果為:" + add;
- case '-':
- return "相減結果為:" + sub;
- case '*':
- return "相乘結果為:" + mult;
- case '/':
- return "相除結果為:" + division;
- default:
- return "出錯";
- }
- }
- }
java 代碼
- package org.common;
- public class Test {
- public static void main(String[] args){
- float a = 200;
- float b = 50;
- Calculate cal = new Calculate();
- System.out.println(cal.getResult(a, b, '+'));
- System.out.println(cal.getResult(a, b, '-'));
- System.out.println(cal.getResult(a, b, '*'));
- System.out.println(cal.getResult(a, b, '/'));
- System.out.println(cal.getResult(a, b, '('));
- }
- }
運行結果為:
相加結果為:250.0
相減結果為:150.0
相乘結果為:10000.0
相除結果為:4.0
出錯
2. 用策略模式來實現:
策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。
策略模式使得算法可以在不影響到客戶端的情況下發生變化。使用策略模式可以把行為和環境分割開來。
環境類負責維持和查詢行為類,各種算法則在具體策略中提供。由于算法和環境獨立開來,算法的修改都不會影響環境和客戶端
策略模式:
由三部分組成
A: 抽象策略角色:策略類,通常由一個接口或者抽象類實現
B: 具體策略角色:包裝了相關的算法和行為
C: 環境角色:持有一個策略類的引用,最終給客戶端調用的。
一個抽象策略角色:
java 代碼
- package org.strategy;
- /**
- * 抽象策略角色
- */
- public abstract class AbstractStrategy {
- public abstract String calculate(float a,float b);
- }
幾個具體策略角色:
java 代碼
- package org.strategy;
- /**
- * 具體策略角色
- */
- public class SubStrategy extends AbstractStrategy{
- public String calculate(float a,float b){
- float result = a-b;
- return "相減結果為:" + result;
- }
- }
java 代碼
- package org.strategy;
- /**
- * 具體策略角色
- */
- public class AddStrategy extends AbstractStrategy{
- public String calculate(float a,float b){
- float result = a+b;
- return "相加結果為:" + result;
- }
- }
java 代碼
- package org.strategy;
- /**
- * 具體策略角色
- */
- public class MultStrategy extends AbstractStrategy{
- public String calculate(float a,float b){
- float result = a*b;
- return "相乘結果為:" + result;
- }
- }
java 代碼
- package org.strategy;
- /**
- * 具體策略角色
- */
- public class DivisionStrategy extends AbstractStrategy{
- public String calculate(float a,float b){
- float result = a/b;
- return "相除結果為:" + result;
- }
- }
環境角色:
java 代碼
- package org.strategy;
- /**
- * 環境角色,最終給客戶端調用的
- */
- public class ContextRole {
- /**
- * 擁有一個策略類的引用
- */
- private AbstractStrategy abstactStrategy;
- public ContextRole(AbstractStrategy abstactStrategy){
- this.abstactStrategy = abstactStrategy;
- }
- public String calculate(float a,float b) {
- String result = abstactStrategy.calculate(a, b);
- return result;
- }
- }
客戶端調用:
java 代碼
- package org.strategy;
- /**
- * 客戶端
- */
- public class Test {
- public static void main(String[] args){
- float a = 200;
- float b = 25;
- ContextRole contextRole1 = new ContextRole(new AddStrategy());
- System.out.println(contextRole1.calculate(a, b));
- ContextRole contextRole2 = new ContextRole(new SubStrategy());
- System.out.println(contextRole2.calculate(a, b));
- ContextRole contextRole3 = new ContextRole(new MultStrategy());
- System.out.println(contextRole3.calculate(a, b));
- ContextRole contextRole4 = new ContextRole(new DivisionStrategy());
- System.out.println(contextRole4.calculate(a, b));
- }
- }
輸出結果為:
相加結果為:225.0
相減結果為:175.0
相乘結果為:5000.0
相除結果為:8.0
總結:
策略模式優點:
1.可以很方便的動態改變算法或行為
2.避免使用多重條件轉移語句
策略模式缺點:
1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
2.造成很多的策略類。