政策模式介紹
概述
所謂政策,指的是一個類的行為或其算法可以在運作時更改.
就像出行選擇的交通工具,要根據自己的情況,可以自由切換自行車,汽車,火車等等.
三個角色
環境Context 持有政策strategy的引用,通過引用來調用某ConcreteStrategy定義的算法。
抽象政策Strategy 定義所有支援的算法的公共接口
具體政策ConcreteStrategy 實作的政策類
類圖
代碼實作
1.抽象政策接口
public interface Strategy {
public void travel();
}
具體政策的實作
public class BikeStrategy implements Strategy{
@Override
public void travel() {
// TODO Auto-generated method stub
System.out.println("we can travel by bike");
}
}
public class BusStrategy implements Strategy{
@Override
public void travel() {
// TODO Auto-generated method stub
System.out.println("we can travel by Bus");
}
}
public class CarStrategy implements Strategy{
@Override
public void travel() {
// TODO Auto-generated method stub
System.out.println("we can travel by Car");
}
}
3.政策持有者和執行者
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void executeStrategy(){
strategy.travel();
}
}
4.測試
public class Test {
/**
* 建構的過程放在用戶端,用戶端根據自己的需求 ,自己選擇不同的政策
* @param args
*/
public static void main(String[] args) {
System.out.println("===========我選擇政策一==========");
Strategy strategy=new CarStrategy();
Context context =new Context(strategy);
context.executeStrategy();
System.out.println("===========我選擇政策二==========");
Strategy strategy1=new BikeStrategy();
Context context1 =new Context(strategy1);
context1.executeStrategy();
System.out.println("===========我選擇政策三==========");
Strategy strategy3=new BusStrategy();
Context context3 =new Context(strategy3);
context3.executeStrategy();
}
}
5.測試結果
===========我選擇政策一==========
we can travel by Car
===========我選擇政策二==========
we can travel by bike
===========我選擇政策三==========
we can travel by Bus
總結
寫法類似于狀态模式,但思想卻不像狀态模式.
政策模式注重于,采用何種政策,去解決問題.政策建構的過程放在用戶端,用戶端根據自己的需求 ,自己選擇不同的政策
狀态模式則注重于,切換狀态,以及優雅的切換狀态中的動作.狀态建構的過程放在Context中,用戶端隻需要執行不同的動作即可.
但是話又說回來,'if else'可以用政策模式和狀态模式代替
其實這都使用了面向對象的多态的特性==>子類的對象可以指向父類的引用,允許不同類的對象對同一消息作出響應.