一、前言
1.1 背景
針對某種業務可能存在多種實現方式,傳統方式是通過傳統if…else…或者switch代碼判斷;
弊端:
- 代碼可讀性差
- 擴展性差
- 難以維護
1.2 簡介
策略模式是一種行為型模式,它將對象和行為分開,將行為定義為一個行為接口和具體行為的實現。
組成:
- 抽象策略類(Strategy):策略的抽象
- 具體策略類(ConcreteStrategy):具體的策略實現
- 環境類(Context):用來操作策略的上下文環境;
二、案例代碼
此處以Iphone的制造商舉例:抽象策略類(IphoneProducer),具體策略類(ChinaIphoneProducer、VietnamIphoneProducer、USAIphoneProducer),環境類(ProducerContext)
package com.qiangesoft.design.behavioral.strategy;/*** 策略模式*/
public class Strategy {public static void main(String[] args) {ProducerContext context = new ProducerContext();// 中國context.setProducer(new ChinaIphoneProducer());System.out.println("Made in " + context.produce().getProducer());// 越南context.setProducer(new VietnamIphoneProducer());System.out.println("Made in " + context.produce().getProducer());// 美國context.setProducer(new USAIphoneProducer());System.out.println("Made in " + context.produce().getProducer());}
}/*** 1.策略接口* 此處:Iphone制造商*/
interface IphoneProducer {/*** 生產*/Iphone produce();
}/*** 2.策略實現類* 中國制造商、越南制造商、美國制造商*/
class ChinaIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("China");}
}class VietnamIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("Vietnam");}
}class USAIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("USA");}
}/*** 3.環境類*/
class ProducerContext {private IphoneProducer producer;public void setProducer(IphoneProducer producer) {this.producer = producer;}public Iphone produce() {return producer.produce();}
}/*** 蘋果手機*/
class Iphone {/*** 制造商*/private String producer;public Iphone(String producer) {this.producer = producer;}public String getProducer() {return producer;}public void setProducer(String producer) {this.producer = producer;}
}
三、總結
優點:
- 切換算法方便
- 避免大量的條件語句
- 提高代碼的復用性
- 降低耦合度
缺點:
- 策略類過多(類爆炸)
- 客戶端必須了解所有的策略類
- 策略模式的對象數量過多占用更多的內存空間