设计模式——策略模式

1.问题来源:
在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

2.定义:定义一系列的算法,并且把每个算法都封装起来,使他们可以互相替换。本模式使得算法可独立于使用它的客户而变化,也叫作政策模式。

3.结构图示:
策略模式UML图示

4.代码示例
本示例是一个商场的促销打折问题,商场有不同的营销手段,可以打折,也可以满减。这是两种不同的算法,适合使用策略模式。
cashsuper类:(strategy)

public abstract class cashsuper {
    public abstract double getResult(double money);
}

cashNomal全价:(ConcreteStrategyA)

public class cashNormal extends cashsuper{
    public double getResult(double money){
        return money;
    }
}

cashRebate打折:(ConcreteStrategyB)

public class cashRebate extends cashsuper{
    private double moneyRebate; 
    public cashRebate(double moneyRebate){
        this.moneyRebate = moneyRebate;
    }
    public double getResult(double money){
        return money*moneyRebate;
    }
}

cashReturn满减:(ConcreteStrategyC)

public class cashReturn extends cashsuper{
    double moneyCondition,moneyReturn;
    public cashReturn(double moneyCondition,double moneyReturn){
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }
    public double getResult(double money){
        if(money>=moneyCondition){
            return money-moneyReturn;
        }
        return money;
    }
}

cashContext类:(context)
此类要单独说明,此代码已经结合使用了简单工厂模式
如果是单纯使用策略模式,那么会将算法的选择交给客户端完成,代码冗余,此处将算法的选择交给了Context类来完成。

public class cashContext {
    public cashsuper cas = null;
    public cashContext(String type){
        switch(type){
        case "正常收费":
            cas = new cashNormal();
            break;
        case "满300送100":
            cas = new cashReturn(300,100);
            break;
        case "打八折":
            cas = new cashRebate(0.8);
            break;
        }
    }
    public double getResult(double money){
        return cas.getResult(money);
    }
}

Test测试:

public class client {
    public static void main(String args[]){
//      cashContext a = new cashContext("打八折");
//      cashContext a = new cashContext("满300送100");
        cashContext a = new cashContext("正常收费");
        double money = 900.0;
        System.out.println(a.getResult(money));
    }
}

测试结果:
900.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值