策略模式

一、定义

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 --- 《设计模式》

二、适用性

1、一些类只是行为不同,其他的是相同的。
2、需要使用一个算法的不同变体。
3、算法使用到了客户不应该知道的数据。
4、一个类中定义了多种行为,且这些行为在这个类的操作中以多个条件语句的形式出现。

三、代码实现

1、定义一个策略接口

package com.hqzmss.strategy;

public interface Strategy {
    void print();
}

2、定义两个具体策略

package com.hqzmss.strategy;

public class ConcreteStrategyOne implements Strategy {
    public void print() {
        System.out.println("打印一行");
    }
}
package com.hqzmss.strategy;

public class ConcreteStrategyTwo implements Strategy{
    public void print() {
        System.out.println("打印两行");
    }
}

3、定义上下文

package com.hqzmss.strategy;

public class Context {
    private Strategy strategy;

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

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

4、测试类

package com.hqzmss.strategy;

public class TestClass {
    public static void main(String[] args) {
        //  这里的构造方法中传入一个具体策略
        Context context = new Context(new ConcreteStrategyTwo());
        context.print();
    }
}

四、优点

1、可以析取出算法中的公共功能
2、替代继承方法
3、消除条件语句
4、实现同一行为不同的算法选择

五、缺点

1、客户必须了解具体的策略实现,才好选择
2、Strategy跟Context之间的通信开销
3、增加了对象的数目

六、专业术语

1、Strategy:策略
2、ConcreteStrategy:具体策略
3、Context:上下文

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 5,133评论 9 62
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,128评论 2 16
  • 1.初识策略模式 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户...
    王侦阅读 1,493评论 0 3
  • 本文仅仅为入门,高手勿喷。 实际工作中,我们总会遇到类似如下的需求:某支付系统接入以下几种商户进行充值:易宝网易,...
    JarvanMo阅读 14,259评论 14 26
  • 1.概述 demo地址,欢迎star 例子1: 商场产品销售:可以正常价格售出,可以打折形式售出,也可以通过积分的...
    barry阅读 803评论 0 1