java设计模式——策略模式

最近项目中有些模块有重复的功能代码,原来的单一接口实现不能满足当前业务需求,倒逼设计模式的成型。
过去代码中相似的功能点基本是直接剥离到公共类和工具类当中,但是随着需求的增多,业务代码中多了许多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);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值