1.策略模式是什么?为什么?2.类图3.例子4.策略模式的优点5.策略模式的缺点
1.策略模式是什么?为什么?软件开发中常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。比如一个超市的优惠有多种多样的方式,多种优惠方式对应了算法。如果我们将这些算法封装起来,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
为了解决上述问题,我们可以用简单工厂模式来实现,但这些优惠策略是经常改变的,比如双11,双12,购物节,经常变动优惠。若用工厂模式不符合于软件设计中开闭原则,因此我门可以考虑用策略模式来实现:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。
Strategy接口,定义所有支持的算法的公共接口
ConcreteStrategy ,封装了具体算法和行为
Context,用ConcreteStrategy来配置,维护一个对Srategy的使用。
下面就用策略模式设计购物优惠活动
Strategy(抽象策略类)
interface PreferentialStrategy {
public void result();
}
具体策略类(ConcreteStrategy)
class DiscountStrategy implements PreferentialStrategy{
@Override
public void result() {
System.out.println("打折后的价格");
}
}
class FullReductionStrategy implements PreferentialStrategy{
@Override
public void result(){
System.out.println("满减后的价格");
}
}
class DoubleStrategy implements PreferentialStrategy{
@Override
public void result(){
System.out.println("满2送1后的价格");
}
}
Context类
class StrategyContext {
PreferentialStrategy strategy;
public StrategyContext(PreferentialStrategy strategy){
this.strategy=strategy;
}
public void ShowResult(){
strategy.result();
}
}
测试
class StrategyTest {
public static void main(String[] args) {
StrategyContext s=null;
Scanner input=new Scanner(System.in);
int number =input.nextInt();
switch (number){
case 1:
s=new StrategyContext(new DiscountStrategy());
break;
case 2:
s=new StrategyContext(new FullReductionStrategy());
break;
case 3:
s=new StrategyContext(new DoubleStrategy());
break;
}
s.ShowResult();
}
}
4.策略模式的优点
1)提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择具体算法或行为,也可以灵活地增加新的算法或行为。
2)避免了多重的if-else条件选择语句,利于系统的维护。
3)提供了一种算法的复用机制,不同的环境类可以方便地复用这些策略类。
5.策略模式的缺点1)客户端需要知道所有的策略类,并自行决定使用哪一个策略 => 只适用于客户端了解所有策略算法的情况。
2)将造成系统产生很多的具体策略类,任何细小的变化都将导致系统要增加一个具体策略类 => 类的个数也许会超出预期。
3)无法在客户端同时使用多个策略类 => 客户端每次只能使用一个策略类。



