java策略模式

32 篇文章 0 订阅
20 篇文章 0 订阅

简介

策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。

策略模式主要由这三个角色组成,环境角色(Context)、抽象策略角色(Strategy)和具体策略角色(ConcreteStrategy)。

  • 环境角色(Context):持有一个策略类的引用,提供给客户端使用。
  • 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。

示例图如下:
在这里插入图片描述

代码实现:

充值方式枚举:

public enum RechargeTypeEnum {
    E_BANK(1, "网银"),
    BUSI_ACCOUNTS(2, "商户账号"),
    MOBILE(3,"手机卡充值"),
    CARD_RECHARGE(4,"充值卡")
    ;

    private Integer value;
    private String description;

    private RechargeTypeEnum(Integer value, String description) {
        this.value = value;
        this.description = description;
    }

    public Integer value() {
        return value;
    }

    public String description() {
        return description;
    }

    public static RechargeTypeEnum valueOf(Integer value) {
        for(RechargeTypeEnum type : RechargeTypeEnum.values()) {
            //if(type.value() == value) {
            if(type.value().equals(value)) {
                return type;
            }
        }
        return null;
    }
}

策略接口定义:

public interface RechargeStrategy {
    public Double calRecharge(Double charge, RechargeTypeEnum type);

    public String getRechargeName(String name, RechargeTypeEnum type);
}

不同策略的具体实现类:

public class EBankRechargeStrategy implements RechargeStrategy {
    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
        return charge * 0.85;
    }

    @Override
    public String getRechargeName(String name, RechargeTypeEnum type) {
        return name + "调用了策略实现类:网银";
    }
}
public class BusiAcctRechargeStrategy implements RechargeStrategy {
    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
        return charge * 0.90;
    }

    @Override
    public String getRechargeName(String name, RechargeTypeEnum type) {
        return name + "调用了策略实现类:商户账号";
    }
}
public class MobileRechargeStrategy implements RechargeStrategy {
    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
        return charge;
    }

    @Override
    public String getRechargeName(String name, RechargeTypeEnum type) {
        return name + "调用了策略实现类:手机卡充值";
    }
}
public class CardRechargeStrategy implements RechargeStrategy {
    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
        return charge + charge * 0.1;
    }

    @Override
    public String getRechargeName(String name, RechargeTypeEnum type) {
        return name + "调用了策略实现类:充值卡";
    }
}

上下文Context定义:

public class StrategyFactory {
    private static StrategyFactory factory = new StrategyFactory();

    private StrategyFactory() {

    }

    private static Map<Integer, RechargeStrategy> strategyMap = new HashMap<>();

    static {
        strategyMap.put(RechargeTypeEnum.E_BANK.value(), new EBankRechargeStrategy());
        strategyMap.put(RechargeTypeEnum.BUSI_ACCOUNTS.value(), new BusiAcctRechargeStrategy());
        strategyMap.put(RechargeTypeEnum.MOBILE.value(), new MobileRechargeStrategy());
        strategyMap.put(RechargeTypeEnum.CARD_RECHARGE.value(), new CardRechargeStrategy());
    }

    public RechargeStrategy creator(Integer type) {
        return strategyMap.get(type);
    }

    public static StrategyFactory getInstance() {
        return factory;
    }
}
public class RechargeContext {
    private RechargeStrategy strategy;

    public Double calRecharge(Double charge, Integer type) {
        strategy = StrategyFactory.getInstance().creator(type);
        return strategy.calRecharge(charge, RechargeTypeEnum.valueOf(type));
    }

    public String getRechargeName(String name, Integer type) {
        strategy = StrategyFactory.getInstance().creator(type);
        return strategy.getRechargeName(name, RechargeTypeEnum.valueOf(type));
    }

    public RechargeStrategy getStrategy() {
        return strategy;
    }

    public void setStrategy(RechargeStrategy strategy) {
        this.strategy = strategy;
    }
}

测试类:

@SpringBootTest
public class StrategyTest {

    @Test
    public void test02(){
        RechargeContext recharge = new RechargeContext();

        String msg = "";

        msg = recharge.getRechargeName("E_BANK", RechargeTypeEnum.E_BANK.value());
        System.out.println(msg);

        msg = recharge.getRechargeName("BUSI_ACCOUNTS", RechargeTypeEnum.BUSI_ACCOUNTS.value());
        System.out.println(msg);

        msg = recharge.getRechargeName("MOBILE", RechargeTypeEnum.MOBILE.value());
        System.out.println(msg);

        msg = recharge.getRechargeName("CARD_RECHARGE", RechargeTypeEnum.CARD_RECHARGE.value());
        System.out.println(msg);
    }

    @Test
    public void test01(){
        RechargeContext recharge = new RechargeContext();

        Double money = null;
        //网银
        money = recharge.calRecharge(100D, RechargeTypeEnum.E_BANK.value());
        System.out.println(RechargeTypeEnum.E_BANK.description() + ": " + money);

        //商户账号
        money = recharge.calRecharge(100D, RechargeTypeEnum.BUSI_ACCOUNTS.value());
        System.out.println(RechargeTypeEnum.BUSI_ACCOUNTS.description() + ": " + money);

        //手机卡充值
        money = recharge.calRecharge(100D, RechargeTypeEnum.MOBILE.value());
        System.out.println(RechargeTypeEnum.MOBILE.description() + ": " + money);

        //充值卡
        money = recharge.calRecharge(100D, RechargeTypeEnum.CARD_RECHARGE.value());
        System.out.println(RechargeTypeEnum.CARD_RECHARGE.description() + ": " + money);
    }
}

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,我们创建表示各种策略的对象和一个上下文对象,该对象可以根据其策略对象的不同行为而更改其执行算法。 以下是Java策略模式的示例代码: 首先,我们定义一个策略接口,该接口定义了一个方法calculate(),该方法将由具体策略类实现: ```java public interface Strategy { public int calculate(int num1, int num2); } ``` 然后,我们实现两个具体策略类,它们实现了策略接口并提供了自己的实现: ```java public class AddStrategy implements Strategy { public int calculate(int num1, int num2) { return num1 + num2; } } public class SubtractStrategy implements Strategy { public int calculate(int num1, int num2) { return num1 - num2; } } ``` 接下来,我们定义一个上下文类,该类将使用策略接口来执行算法: ```java public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.calculate(num1, num2); } } ``` 最后,我们可以在客户端代码中使用上下文对象来执行算法: ```java public class Client { public static void main(String[] args) { Context context = new Context(new AddStrategy()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new SubtractStrategy()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); } } ``` 输出结果为: ``` 10 + 5 = 15 10 - 5 = 5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值