1什么是策略模式
对于同一个任务可以有多种实现方法,算法的选择可以由客户端动态切换。我们可以定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
2策略模式的主要运用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
3策略模式优缺点。
优点:
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。
注意:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现
UML图
1.创建接口
public interface ParkingStrategy {
Lot selectLot(Set<Lot> lots, Map<Lot, Parkable> status, Parkable c) throws Exception;
}
2.创建实现接口的实体类
public class RandomParkingStrategy implements ParkingStrategy {
@Override
public Lot selectLot(Set<Lot> lots, Map<Lot, Parkable> status, Parkable c) throws Exception {
List<Lot> freeLots = new ArrayList<>();
for (Lot lot : lots) {
if (!status.containsKey(lot) && lot.getWidth() >= c.getWidth())
freeLots.add(lot);
}
int num = freeLots.size();
if (num > 1) {
int i = new Random().nextInt(num - 1);
return freeLots.get(i);
}
else if(num == 1)
return freeLots.get(0);
throw new Exception();
}
}
public class SequentialParkingStrategy implements ParkingStrategy {
@Override
public Lot selectLot(Set<Lot> lots, Map<Lot, Parkable> status, Parkable c) throws Exception {
for (Lot lot : lots) {
if (!status.containsKey(lot) && lot.getWidth() >= c.getWidth())
return lot;
}
throw new Exception();
}
}
3.调用