优点:算法可自由切换,避免了多重条件判断,扩展性良好,符合开闭原则。
缺点:算法多了,类也增多,每个算法都会形成一个类,而且每个算法必须对上层暴露。
主要用于分离算法,选择实现。
角色:
Context封装角色,也叫作上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能的变化。
Strategy抽象策略角色,策略算法家族的抽象,通常为接口定义每个算法必须具有的方法和属性。
ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法。
例子从简:模仿报价,A类型客户不打折,B类型客户打9折,C类型客户打8折,D类型客户打7折。
创建抽象策略角色(Strategy):
/**
* Strategy抽象策略角色,策略算法家族的抽象,通常为接口定义每个算法必须具有的方法和属性。
*/
public interface Strategy {
double getPrice(double price);
}
创建A、B、C、D四个具体策略角色(ConcreteStrategy):
import android.util.Log;
/**
* ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法
* A类型客户
*/
public class ConcreteStrategyA implements Strategy {
@Override
public double getPrice(double price) {
Log.d("TAG", "A类型客户,不打折");
return price;
}
}
import android.util.Log;
/**
* ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法
* 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具体策略角色,实现抽象策略中的操作该类含有具体的算法
* 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具体策略角色,实现抽象策略中的操作该类含有具体的算法
* D类型客户
*/
public class ConcreteStrategyD implements Strategy {
@Override
public double getPrice(double price) {
Log.d("TAG", "D类型客户,打七折");
return price * 0.7;
}
}
创建Context封装角色:
/**
* Context封装角色,也叫作上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能的变化。
*/
public class StrategyContext {
private Strategy strategy;
public StrategyContext(Strategy strategy) {
this.strategy = strategy;
}
public double getPrice(double price) {
return strategy.getPrice(price);
}
}
调用:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//假设客户类型为C类客户
StrategyContext context = new StrategyContext(new ConcreteStrategyC());
double price = context.getPrice(10000);
Log.d("TAG", "报价为:" + price);
}
}
结果:image.png
已完成测试!有不对的地方欢迎指出,感恩。