ICode9

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

设计模式之策略模式

2022-05-02 17:33:33  阅读:159  来源: 互联网

标签:distance 策略 int 模式 CalculateStrategy 设计模式 calculateTrafficeFee public


定义

策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换

使用场景

当你写代码的时候发现一个操作有好多种实现方法,而你需要根据不同的情况使用if-else等分支结构来确定使用哪种实现方式的时候,想一想这个模式。

 

普通实现

如果我们正常写代码,平时也应该这样,首先保证把功能正确的实现了,然后慢慢重构,设计模式都是在不断的重构当中应用的。 王二狗会调用会调用goToTianJinEye()方法,根据自己的实际情况,选择某一种出行方式。

public class TrafficFeeCalculator {
    public int goToTianJinEye(String way, int distance) {
        int trafficFee = 0;
        switch (way) {
            case "bus":
                if (distance < 10)
                    trafficFee = 4;
                else
                    trafficFee = 6;
                break;
            case "didi":
                if(distance<3)
                    trafficFee = 8;
                else 
                    trafficFee=8+(distance-3)*3;
                break;
            case "sharedBicyle":
                trafficFee = 2;
                break;
            default:
                break;
        }
        return trafficFee;
    }
}

那么这么写有什么弊端呢? 第一:每一种出行方式的交通花费的计算方式都写在了TrafficFeeCalculator类中,这个类承担的职责较多,违反了单一职责原则。 第二:假如王二狗突然想自己开车去,那就需要修改goToTianJinEye这个方法了。违反了开闭原则。

策略模式实现

public interface CalculateStrategy {

    int calculateTrafficeFee(int distance);
}

class Bus implements CalculateStrategy {
    @Override
    public int calculateTrafficeFee(int distance) {
        return Math.min(10, distance);
    }
}

class Gaode implements CalculateStrategy {
    @Override
    public int calculateTrafficeFee(int distance) {
        return Math.max(distance, 20);
    }
}

class SharedDibai implements CalculateStrategy {
    @Override
    public int calculateTrafficeFee(int distance) {
        return 2;
    }
}

class TrafficeFeeCalculate{

    public int goTianAnMen(CalculateStrategy calculateStrategy, int distance) {
       return calculateStrategy.calculateTrafficeFee(distance);
    }

    public static void main(String[] args) {
        TrafficeFeeCalculate trafficeFeeCalculate = new TrafficeFeeCalculate();
        int i = trafficeFeeCalculate.goTianAnMen(new Bus(), 10);
        System.out.println("公交车"+i);
        int i1 = trafficeFeeCalculate.goTianAnMen(new Gaode(), 10);
        System.out.println("打高德"+i1);
    }
}

优缺点

优点:降低了算法类的职责,使各个算法可以独立变化并互相替换。而且使得增加新的算法变的很容易,降低了对原有系统的侵入,最终使得程序可扩展可维护性增强。

缺点:所有设计模式的通病,类增多了,程序从局部来看变的更复杂了。

总结

是不是感觉讲设计模式的文章都有一个特点,使用了设计模式反而比不使用设计模式使程序看起来更加复杂,而不是更加简单。那是因为每篇文章的示例都是无实际使用意义的示例代码,实际情况是程序非常复杂才需要使用到设计模式。一个大型程序是不断迭代出来的,一开始肯定不长那样,程序员日常接到一个开发任务也不要过多的想,这个我应该用个什么设计模式呀?先把功能实现了,然后回头看看有没有遵循面向对象编程6大原则,如果没有想想怎么改进,然后设计模式就登场了。。。

标签:distance,策略,int,模式,CalculateStrategy,设计模式,calculateTrafficeFee,public
来源: https://www.cnblogs.com/wmdshijie/p/16216220.html

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

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

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

ICode9版权所有