美文网首页
设计模式-策略模式

设计模式-策略模式

作者: __ming | 来源:发表于2017-11-08 17:11 被阅读0次

最近学习设计模式,特此记录下来。

1.策略模式简介

  • 在软件开发中也常常遇到这样子的情况:实现某一功能可能有多种算法或者策略,我们根据不同的策略或者算法来完成该功能。如排序算法 插入、归并、冒泡。

2.定义

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

3.使用场景

  • 正对同一类问题的多种处理方式,仅仅具体行为有差别时。
    -需要安全的封装多种同意类型的操作时。
    -出现同意抽象类有多个子类而且又需要使用 if-else 或者 switch-case 来选择具体子类时。

策略模式的UML类图

![%Q]E}MZB])HYC16_9J1ZBA0.png](https://img.haomeiwen.com/i4314442/600309f5d6483c46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  • Context--- 用来操作策略上下文环境。
  • Stragety-- 策略的抽象。
  • ConcrecteStragetyA 、 ConcrecteStragetyA具体的策略实现。

4.策略的简单实现。

  • 通常如果一个问题有多个解决方案,最简单的方法就是利用if-else 或者 switch-case 方式根据不同的场景选择不同的解决方案。
  • 计算接口
public interface CalculatorStragety {
    /**
     * 按距离来计算价格
     * @param km  距离
     * @return  返回价格
     */
    int calculator(int km);
}
  • 公交车计算价格

public class Busstrategy implements CalculatorStragety {
    @Override
    public int calculator(int km) {
        int extraTotl = km-10;
        int extroFactor = extraTotl /5;
        int fraction = extraTotl % 5;
        int price = 1 + extroFactor*1;
        return fraction > 0 ? ++price: price ;
    }
}
  • 地铁计算价格

public class Subwaytrategy implements CalculatorStragety {

    @Override
    public int calculator(int km) {
        if (km <= 6) {
            return 3;
        }else if (km >=6 && km <= 12) {
            return 4;
        }else if (km >=12 && km <= 22) {
            return 5;
        }else if (km >=22 && km <= 32) {
            return 6;
        }else {
            return 7;
        }
    }
}
  • Context 角色类
public class Pricecalculator implements CalculatorStragety {    
    private CalculatorStragety stragety;

    public static void main(String[] args) {
        Pricecalculator culator = new Pricecalculator();
                // 设置价格策略 Busstrategy
        culator.setStragety(new Busstrategy());
        System.out.println("calculator resutl = "+culator.calculator(30));
                // 设置价格策略 Subwaytrategy
        culator.setStragety(new Subwaytrategy());
        System.out.println("calculator resutl = "+culator.calculator(30));
    }
    public void setStragety(CalculatorStragety stragety) {
        this.stragety = stragety;
    }
    @Override
    public int calculator(int km) {
        return this.stragety.calculator(km);
    }
}
  • 最终打印结果是
    calculator resutl = 5
    calculator resutl = 6

总结

  • 如果把那些逻辑都用if-else 或者 switch-case 来实现的话,整个类的代码臃肿逻辑复杂, 难以升级和维护。
    而使用策略模式的话,则通过不同的策略实现算法替换, 在简化逻辑、结构的同时增强了可读性、稳定性和可扩展性代码更为直观。

相关文章

网友评论

      本文标题: 设计模式-策略模式

      本文链接:https://www.haomeiwen.com/subject/eviouxtx.html