美文网首页
java设计模式——策略模式

java设计模式——策略模式

作者: 一盒玫瑰 | 来源:发表于2018-09-15 22:34 被阅读0次

最近项目中有些模块有重复的功能代码,原来的单一接口实现不能满足当前业务需求,倒逼设计模式的成型。
过去代码中相似的功能点基本是直接剥离到公共类和工具类当中,但是随着需求的增多,业务代码中多了许多if...else..的判断,这使得项目的耦合性变得很高。我们选择了策略模式作为主要的设计模式来对原有代码进行手术。

策略模式的优点:
各自的类实现各自的方法,它们不属于任何方法或实体;
可以根据需要被选择,类与类之间互不干扰;

策略模式的缺点:
所有策略类需要暴露;
需要的算法越多,策略类就越多

所以我们应该根据情况来判断,最好是多种模式混合使用。

接下来我们以一个小学数学应用题来作为示例:

    //甲、乙两人同时从A地出发,以相同的速度向B地前进,甲每行5分钟休息2分钟,
    // 乙每行210米休息3分钟,甲出发后50分钟到达B地,乙到达B地比甲迟了10分钟.
    // 已知两人最后一次的休息地点相距70米,两人的速度是多少?

1、创建一个数学运算的接口:

public interface Strategy {
    double operate(double a, double b);
}

2、创建具体的运算法则来实现这个运算:

public class Plus implements Strategy {
    @Override
    public double operate(double a, double b) {
        return a + b;
    }
}
public class Multiply implements Strategy {
    @Override
    public double operate(double a, double b) {
        return a * b;
    }
}
public class Division implements Strategy {
    @Override
    public double operate(double a, double b) {
        return a / b;
    }
}

3、创建运算过程实体:

public class Operate {
    private Strategy strategy;

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

    public double opertion(double a, double b){
        return strategy.operate(a, b);
    }
}

4、创建人物实体:

public class Person {

    private double rest;

    private double times;

    public double getRest() {
        return rest;
    }

    public void setRest(double rest) {
        this.rest = rest;
    }


    public double getTimes() {
        return times;
    }

    public void setTimes(double times) {
        this.times = times;
    }
}

5、测试类:

Operate plus = new Operate(new Plus());
        Operate substract = new Operate(new Substract());
        Operate multiply = new Operate(new Multiply());
        Operate division = new Operate(new Division());
        Person liLei = new Person();
        Person hanMeiMei = new Person();

        //计算甲休息的次数
        liLei.setTimes(Math.floor(division.opertion(50, plus.opertion(5, 2))));
        //计算甲休息的时间
        liLei.setRest(multiply.opertion(2, liLei.getTimes()));
        //计算乙休息的时间
        hanMeiMei.setRest(plus.opertion(liLei.getRest(), 10));
        //计算乙休息的次数
        hanMeiMei.setTimes(Math.floor(division.opertion(hanMeiMei.getRest(), 3)));
        //计算总路程
        double length= plus.opertion(multiply.opertion(210, hanMeiMei.getTimes()), 70);
        //计算总时间
        double time = multiply.opertion(5, liLei.getTimes());

        double rate = division.opertion(length, time);

感谢阅读,不足之处还请多多指点:)

相关文章

  • java建造者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java单例模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java外观模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java适配器模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java观察者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java代理模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java策略模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • Java 常用设计模式简例

    简述Java常用设计模式 简述Java常用设计模式及设计原则 strate---------策略模式针对接口编程,...

  • 策略模式

    参考资料:漫话:如何给女朋友解释什么是策略模式? 设计模式之策略模式(实例+Demo) Java设计模式(8)——...

  • 学习Head First设计模式Day1

    Java设计模式之设计模式 策略模式:策略模式定义了算法簇,分别封装起来,让他们之间可以互相替换,此设计模式让算法...

网友评论

      本文标题:java设计模式——策略模式

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