设计模式之策略模式

策略模式定义:针对对一组算法,将每一个算法封装到具有公共接口的独立类中,使得他们可以相互替换,可以在不影响到客户端情况下发生改变。策略模式是一种行为型设计模式。

模式模型:

  • 抽象策略模型:定义为公共接口,声明策略;
  • 具体策略:实现抽象策略模型,提供具体的策略计算逻辑;
  • 环境模型(策略持有者):包含策略模型引用,策略方法的调用等,可以是独立的一个类也可以就是调用策略本身对象。

抽象策略只是作为一个公共父类,可以使用类,定义成抽象的;也可以使用接口来实现。这里用接口来做例子。

抽象策略类,只定义了一个策略方法。

public interface AbsStrategy {

    void fight(); //
}

俩个具体策略类,分别是械斗策略与空手格斗策略。

//使用枪械,枪斗
public class GunAbsStrategy implements AbsStrategy {
    @Override
    public void fight() {
        Log.d("TAG", "FIGHT WITH GUN");
    }
}


//不使用武器,空手格斗
public class RiotStrategy implements AbsStrategy {
    @Override
    public void fight() {
        Log.d("TAG", "FIGHT WITH RIOT");
    }
}

环境模型,根据不同环境条件自由切换不同策略。

public class BattleGround {

    private AbsStrategy strategy;

    public AbsStrategy getStrategy() {
        return strategy;
    }

    public void setStrategy(AbsStrategy strategy) {
        this.strategy = strategy;
    }

    public void startFight() {
        strategy.fight();
    }
}

具体使用例子:

 BattleGround battle = new BattleGround();
 //空手格斗,使用格斗策略
 battle.setStrategy(new RiotStrategy());
 battle.startFight();
 //切换枪斗策略
 battle.setStrategy(new GunAbsStrategy());
 battle.startFight();

 策略模式的应用场景:

  1. 需要根据不同环境条件动态地在几种实现算法中选择一种时;
  2. 实现算法相互独立,并且要求隐藏具体算法的实现细节时;

优势:

  • 可以避免使用多重条件语句;
  • 策略类的继承或实现关系,使公共策略部分可以迁移到父类中,避免代码重复;
  • 策略类可以相互替换,相互独立并且不会对调用者产生影响,灵活,安全;

劣势:

  • 要理解所有策略算法的区别,以便能选择最合适策略类,增加时间开销;
  • 可能会产生很多的具体策略类。

小结一下,策略模式其实应用还是很广泛的。很多的业务都会根据不一样的条件从而要去处理不同的业务。就可以把这些不同的业务当成是具体策略模型。抽象,封装策略会使得代码看起来更加的有结构,而不是清一色的if else。当然也不能滥用,要在适当的情况下使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值