ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

策略模式

2020-01-16 23:55:23  阅读:283  来源: 互联网

标签:策略 manager 模式 Strategy 算法 calc public


个人博客

http://www.milovetingting.cn

策略模式

模式介绍

实现某一个功能有多种算法或者策略,可以根据实际情况选择不同的算法或者策略来实现该功能,如果将这些算法或者策略抽象出来,提供一个统一的接口,不同的算法或策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态替换,这种模式的可扩展性,可维护性更高。这就是策略模式。

模式定义

策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

使用场景

  1. 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时

  2. 需要安全地封装多种同一类型的操作时

  3. 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。

定义策略接口类

public interface Strategy {
    
    int calc();

}

定义具体的策略实现类

public class Strategy1 implements Strategy {

    @Override
    public int calc() {
        System.out.println("Strategy1");
        return 1;
    }

}

public class Strategy2 implements Strategy {

    @Override
    public int calc() {
        System.out.println("Strategy2");
        return 2;
    }

}

增加一个策略管理类

public class StrategyManager {

    private Strategy mStrategy;

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

    public int calc() {
        return mStrategy.calc();
    }

}

通过setStrategy,可以动态替换具体的策略类

在客户端中调用

public static void main(String[] args) {
        StrategyManager manager = new StrategyManager();
        Strategy strategy1 = new Strategy1();
        manager.setStrategy(strategy1);
        manager.calc();
        Strategy strategy2 = new Strategy2();
        manager.setStrategy(strategy2);
        manager.calc();
    }

输出结果

Strategy1
Strategy2

依次执行了策略1和策略2。

小结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。策略模式很好地演示了开闭原则,也就是定义抽象,注入不同的实现,从而达到很好的可扩展性。

标签:策略,manager,模式,Strategy,算法,calc,public
来源: https://www.cnblogs.com/milovetingting/p/12203784.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有