優(yōu)點(diǎn):算法可自由切換,避免了多重條件判斷,擴(kuò)展性良好,符合開(kāi)閉原則。
缺點(diǎn):算法多了,類也增多,每個(gè)算法都會(huì)形成一個(gè)類,而且每個(gè)算法必須對(duì)上層暴露。
主要用于分離算法,選擇實(shí)現(xiàn)。
角色:
Context封裝角色,也叫作上下文角色,屏蔽高層模塊對(duì)策略、算法的直接訪問(wèn),封裝可能的變化。
Strategy抽象策略角色,策略算法家族的抽象,通常為接口定義每個(gè)算法必須具有的方法和屬性。
ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法。
例子從簡(jiǎn):模仿報(bào)價(jià),A類型客戶不打折,B類型客戶打9折,C類型客戶打8折,D類型客戶打7折。
創(chuàng)建抽象策略角色(Strategy):
/**
* Strategy抽象策略角色,策略算法家族的抽象,通常為接口定義每個(gè)算法必須具有的方法和屬性。
*/
public interface Strategy {
double getPrice(double price);
}
創(chuàng)建A、B、C、D四個(gè)具體策略角色(ConcreteStrategy):
import android.util.Log;
/**
* ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
* A類型客戶
*/
public class ConcreteStrategyA implements Strategy {
@Override
public double getPrice(double price) {
Log.d("TAG", "A類型客戶,不打折");
return price;
}
}
import android.util.Log;
/**
* ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
* B類型客戶
*/
public class ConcreteStrategyB implements Strategy {
@Override
public double getPrice(double price) {
Log.d("TAG", "B類型客戶,打九折");
return price * 0.9;
}
}
import android.util.Log;
/**
* ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
* C類型客戶
*/
public class ConcreteStrategyC implements Strategy {
@Override
public double getPrice(double price) {
Log.d("TAG", "C類型客戶,打八折");
return price * 0.8;
}
}
import android.util.Log;
/**
* ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
* D類型客戶
*/
public class ConcreteStrategyD implements Strategy {
@Override
public double getPrice(double price) {
Log.d("TAG", "D類型客戶,打七折");
return price * 0.7;
}
}
創(chuàng)建Context封裝角色:
/**
* Context封裝角色,也叫作上下文角色,屏蔽高層模塊對(duì)策略、算法的直接訪問(wèn),封裝可能的變化。
*/
public class StrategyContext {
private Strategy strategy;
public StrategyContext(Strategy strategy) {
this.strategy = strategy;
}
public double getPrice(double price) {
return strategy.getPrice(price);
}
}
調(diào)用:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
/**
* 這是調(diào)用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//假設(shè)客戶類型為C類客戶
StrategyContext context = new StrategyContext(new ConcreteStrategyC());
double price = context.getPrice(10000);
Log.d("TAG", "報(bào)價(jià)為:" + price);
}
}
結(jié)果:
image.png
已完成測(cè)試!有不對(duì)的地方歡迎指出,感恩。