聊聊策略模式

133 阅读2分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情

1、简介

策略模式就是把各个平等的具体实现进行抽象、封装成为独立的算法类,然后通过上下文和具体的算法类来进行交互。各个策略算法都是平等的,地位是一样的,正是由于各个算法的平等性,所以它们才是可以相互替换的。虽然我们可以动态的切换各个策略,但是同一时刻只能使用一个策略。

2、范例

比如去服装店买衣服,普通会员不打折,黄金会员打9折,铂金会员打8折,钻石会员打7折,这样不同的客户价格计算方式不同,这个时候就可以使用策略模式。

3、代码实现

3.1、定义接口

public interface IStrategy {
    public void operate();
}

3.2、 根据会员等级,设置对应折扣

public class BackDoor implements IStrategy {
    @Override
    public void operate() {
        System.out.println("打9折");
    }
}

public class GivenGreenLight implements IStrategy {
    @Override
    public void operate() {
        System.out.println("打8折");
    }
}

public class BlackEnemy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("打7折");
    }
}

3.3、定义上下文,构造函数,使用哪个方法

public class Context {
    private IStrategy strategy;
    //构造函数,要你使用哪个方法
    public Context(IStrategy strategy){
        this.strategy = strategy;
    }
    public void setStrategy(IStrategy strategy){
        this.strategy = strategy;
    }
    public void operate(){
        this.strategy.operate();
    }
}

3.4、测试,达到预期效果

public class Zhaoyun {
    public static void main(String[] args) {
        Context context;
        System.out.println("----------黄金会员---------------");
        context = new Context(new BackDoor());
        context.operate();
        System.out.println("\n");
        System.out.println("----------铂金会员---------------");
        context.setStrategy(new GivenGreenLight());
        context.operate();
        System.out.println("\n");
        System.out.println("----------钻石会员---------------");
        context.setStrategy(new BlackEnemy());
        context.operate();
        System.out.println("\n");
    }
}

image.png

4、优点

我们之前在选择方式的时候,往往会使用if-else语句,也就是用户不选择A那么就选择B这样的一种情况。这种情况耦合性太高了,而且代码臃肿,有了策略模式我们就可以避免这种现象,策略模式遵循开闭原则,实现代码的解耦合。扩展新的方法时也比较方便,只需要继承策略接口就好了。