策略模式
概念
在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等。
策略模式结构
策略模式主要包含
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
策略模式实例
定义一个大闸蟹加工的抽象策略类(CrabCooking),里面包含了一个做菜的抽象方法CookingMethod();然后,定义清蒸大闸蟹(SteamedCrabs)和红烧大闸蟹(BraisedCrabs)的具体策略类,它们实现了抽象策略类中的抽象方法;最后,定义一个厨房(Kitchen)环境类,它具有设置和选择做菜策略的方法;客户类通过厨房类获取做菜策略。
抽象策略及具体策略
package strategy;
/**
* 抽象策略接口:大闸蟹加工类
*/
public interface CrabCooking {
/**
* 处理大闸蟹的策略
*/
void cookingMethod();
}
package strategy;
/**
* 具体策略类:清蒸大闸蟹
*/
public class SteamedCrabs implements CrabCooking {
@Override
public void cookingMethod() {
System.out.println("清蒸大闸蟹!");
}
}
package strategy;
/**
* 具体策略类:红烧大闸蟹
*/
public class BraisedCrabs implements CrabCooking {
@Override
public void cookingMethod() {
System.out.println("红烧大闸蟹!");
}
}
上下文
维护指向具体策略的引用,且仅通过策略接口与该对象进行交流:
package strategy;
/**
* Context类:厨房(做菜的策略)
*/
public class Kitchen {
private CrabCooking strategy;
public void setStrategy(CrabCooking strategy) {
this.strategy = strategy;
}
public CrabCooking getStrategy() {
return strategy;
}
public void cookingMethod() {
/**
* 做大闸蟹的策略
*/
strategy.cookingMethod();
}
}
客户
package strategy;
public class Client {
public static void main(String[] args) {
Kitchen kitchen = new Kitchen();
SteamedCrabs steamedCrabs = new SteamedCrabs();
// 厨房使用清蒸的方式处理大闸蟹
kitchen.setStrategy(steamedCrabs);
// 厨房开始做清蒸大闸蟹
kitchen.cookingMethod();
System.out.println("===========");
BraisedCrabs braisedCrabs = new BraisedCrabs();
kitchen.setStrategy(braisedCrabs);
kitchen.cookingMethod();
}
}