一、基本概念
1、定义:
定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变换。
2、类图:
* Context对象: 封装可能存在的策略变化,屏蔽其他模块对算法的直接访问
* Stategy抽象策略:定义通用算法规则
* ConcreteStategy具体策略:含有具体的算法
3、应用场景:
* 对调用者隐藏算法具体实现细节
* 针对同一问题有多种处理方式
4、优点:
避免多种处理方式存在的if else语句。方便拓展,多一种处理方式,就多加一个实现类
5、缺点:
算法过多会造成多个算法实现类。Context需要了解所有的算法,并做出相应的调用。
二、实例:
例如租房可以通过各种途径,包括中介、房东、朋友等。每一种途径都可以当成一种策略,可以互相切换。
1、抽象策略:
public interface RentingStrategy {
void renting();
}
2、具体策略
中介:
public class AgencyStrategy implements RentingStrategy {
@Override
public void renting() {
System.out.println("通过中介租房");
}
}
房东:
public class LandlordStrategy implements RentingStrategy {
@Override
public void renting() {
System.out.println("通过房东租房");
}
}
朋友:
public class FriendStrategy implements RentingStrategy {
@Override
public void renting() {
System.out.println("通过朋友租房");
}
}
3、Context
public class Context {
private RentingStrategy mRentingStrategy;
public Context(RentingStrategy rentingStrategy) {
this.mRentingStrategy = rentingStrategy;
}
public void rentHouse() {
this.mRentingStrategy.renting();
}
}
4、调用
public class StrategyTest{
public static void main(String[] args) {
RentingStrategy friendStrategy = new FriendStrategy();
Context context = new Context(friendStrategy);
context.rentHouse();
}
}
结论: