设计模式之策略模式

策略模式

策略模式就是,有一组算法,将每个算法都封装起来,并且使它们之间可以互换。其实就是利用了面向对象的多态和继承。

栗子
话说刘备去东吴娶亲,诸葛亮给了赵云一组妙计(一共有三个),赵云应该关注的是问锦囊拿妙计就行了。

这里写图片描述

  • 妙计对应IStreategy,一个实现类对应一个策略
  • 锦囊对应Context ,用来存放妙计
  • 赵云关注的是context ,可以通过Context来自由切换妙计
    看代码实现:

IStrategy:

public interface IStrategy {

    public void operate();
}

BackDoor:

public class BackDoor implements IStrategy{

    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施压!");
    }

}

BlockEnemy

public class BlockEnemy implements IStrategy{

    public void operate() {
        System.out.println("孙夫人断后,挡住追兵!");
    }

}

GivenGreenLight

public class GivenGreenLight implements IStrategy{

    public void operate() {
        System.out.println("求吴国太开绿灯,放行!");
    }


}

Context

public class Context {

    private IStrategy strategy;

    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void operate(){
        this.strategy.operate();
    }
}

ZhaoYun

public class ZhaoYun {
    public static void main(String[] args) {
        System.out.println("刚刚到吴国的时候就使用第一条妙计!");
        Context context = new Context(new BackDoor());
        context.operate();
        System.out.println("刘备乐不思蜀了,就使用第二条妙计!");
        context = new Context(new GivenGreenLight());
        context.operate();
        System.out.println("孙权有追兵的时候,就使用第三条妙计!");
        context = new Context(new BlockEnemy());
        context.operate();
    }
}

如果不使用策略模式的话可以这样实现:

public class Context {

    private String strategy;

    public Context(String strategy) {
        this.strategy = strategy;
    }

    public void operate(){
        if("BackDoor".equals(strategy)){
            System.out.println("找乔国老帮忙,让吴国太给孙权施压!");
        }else if("GivenGreenLight".equals(strategy)){
            System.out.println("求吴国太开绿灯,放行!");
        }else if("BlockEnemy".equals(strategy)){
            System.out.println("孙夫人断后,挡住追兵!");
        }
    }
}
public class ZhaoYun {

    public static void main(String[] args) {
        System.out.println("刚刚到吴国的时候就使用第一条妙计!");
        Context context = new Context("BackDoor");
        context.operate();
        System.out.println("刘备乐不思蜀了,就使用第二条妙计!");
        context = new Context("GivenGreenLight");
        context.operate();
        System.out.println("孙权有追兵的时候,就使用第三条妙计!");
        context = new Context("BlockEnemy");
        context.operate();
    }
}

不使用策略模式我们可以使用if-else逻辑代替,但是如果if-else中的算法比较复杂的时候,if-else就会写的相当臃肿,可读性比较差。

小结:
策略模式的
优点:
1. 算法可以自由切换
2. 避免使用多重条件判断
3. 良好的扩展性
缺点:
1. 策略类泛滥
2. 所有的策略类都需要对外暴露 (妙计要对赵云暴露,他要知道锦囊中有哪些妙计)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值