1、前言
在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
2、角色定义
策略Context(上下文)
策略模式定义上下文角色本意是为了通过不同策略对象让上下文调用对应的算法或行为。
策略抽象
策略抽象主要设定行为,定义策略需要具有哪些行为。
策略实现
具体策略的实现,实现策略抽象行为具体细节。
3、UML
FruitMarket(策略抽象)PapayaPeddler、KiwifruitPeddler、WatermelonPeddler(策略算法实现)SellFruitsContext(策略Context)
4、模拟示例
public class SellFruitsContext{
private FruitMarket fruitMarket
;
public SellFruitsContext() {
}
public SellFruitsContext(FruitMarket fruitMarket
) {
this.fruitMarket
= fruitMarket
;
}
public void sellFruit(){
this.fruitMarket
.sellFruits();
}
}
public interface FruitMarket {
void sellFruits();
}
public class KiwifruitPeddler implements FruitMarket {
public void sellFruits() {
System
.out
.println("卖猕猴桃咯,保熟!!");
}
}
public class PapayaPeddler implements FruitMarket {
public void sellFruits() {
System
.out
.println("卖木瓜咯,瓜保熟!!");
}
}
public class WatermelonPeddler implements FruitMarket {
public void sellFruits() {
System
.out
.println("卖西瓜咯,瓜保熟!!");
}
}
public enum FruitEnum
{
KIWIFRUIT(1,KiwifruitPeddler
.class),PAPAYA(2,PapayaPeddler
.class),WATERMELON(3,WatermelonPeddler
.class);
private Integer fruitType
;
private Class
c;
FruitEnum() {
}
FruitEnum(Integer fruitType
, Class
c) {
this.fruitType
= fruitType
;
this.c
= c
;
}
public FruitEnum
getFruitEnumByType(Integer fruitType
){
for (FruitEnum value
: FruitEnum
.values()) {
if(value
.fruitType
==fruitType
)
return value
;
}
return null
;
}
}
5、小结
通过类型在枚举类获取对应策略算法实现类,将策略算法实现类传入策略上下文,通过策略上下文调用具体的策略算法。后期业务扩展可新增枚举数据添加策略算法实现类,完成对扩展业务的实现。
策略模式在代码重构的时候是很常见的,减少大量if else代码、增强代码扩展性、策略算法的灵活切换、避免单个条件重复判断,很多情况选择switch以及if else会比较多,但是随着业务复杂度业务代码量上来了,随之代码的扩展性以及可读性降低代码也显得极其臃肿,虽说对于每一种算法都要为其建立一种策略类,相对比较懒的程序员更愿意写if else,有时候也不要觉得策略算法实现类太多,因为策略算法的多少取决于你的业务复杂度,正是因为策略算法很多才体现出业务的复杂,才更需要用好策略模式。