【Java 设计模式】策略模式,枚举+工厂方法实现

项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改  (代码参照于蚂蚁课堂)

目录

一、什么是策略模式

二、策略模式优缺点

优点:

缺点:

三、枚举+工厂方法实现策略模式code

1.定义共同行为接口

2.具体策略实现类

3.定义枚举,保存策略实现类具体路径

4.策略工厂

5.使用策略工厂获取具体策略实现


一、什么是策略模式

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重If判断问题。

1.环境(Context)角色:持有一个Strategy的引用。

2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

3.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

(定义策略接口→实现不同的策略类→利用多态或其他方式调用策略。)

二、策略模式优缺点

优点:

算法可以自由切换(高层屏蔽算法,角色自由切换)

避免使用多重条件判断(如果算法过多就会出现很多相同的判断,很难维护)

扩展性好(可自由添加取消算法,而不影响整个功能)

缺点:

策略数量增多(每一个策略类复用性小,如果需要增加算法,就只能新增类)

所有的策略类都需要对外暴露(使用的人必须了解使用策略,这个就需要其他模式来补充,比如工厂模式、代理模式)

三、枚举+工厂方法实现策略模式code

1.定义共同行为接口

/**
 * 共同行为
 */
public interface FactApplyStrategy {

    String toAddFact();
}

2.具体策略实现类

package com.google.DesignPatterns.StrategyPattern.fact.impl;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;

/**
 * @author wk
 * @Description:
 * @date 2019/12/24 13:59
 **/
public class GdFactApplyStrategy implements FactApplyStrategy {

    @Override
    public String toAddFact() {
        return "跳转光大银行";
    }
}
package com.google.DesignPatterns.StrategyPattern.fact.impl;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;

/**
 * @author wk
 * @Description:
 * @date 2019/12/26 14:51
 **/
public class JTFactApplyStrategy implements FactApplyStrategy {

    @Override
    public String toAddFact() {
            return "跳转交通银行";
    }
}

3.定义枚举,保存策略实现类具体路径

package com.google.DesignPatterns.StrategyPattern.fact;

/**
 * 策略枚举类
 */
public enum PurposeEnum {

    TYPE_1(1, "中国银行", ""),

    TYPE_2(2, "光大银行", "com.google.DesignPatterns.StrategyPattern.fact.impl.GdFactApplyStrategy"),

    TYPE_3(3, "交通银行", "com.google.DesignPatterns.StrategyPattern.fact.impl.JTFactApplyStrategy"),
    ;

    private Integer code;
    private String mark;
    private String className;

    private PurposeEnum(Integer code, String mark, String className) {
        this.code = code;
        this.mark = mark;
        this.className = className;
    }

    public Integer getCode() {
        return code;
    }

    public String getMark() {
        return mark;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public static PurposeEnum getEnumObjByCode(Integer code) {
        for (PurposeEnum be : values()) {
            if (be.getCode().equals(code)) {
                return be;
            }
        }
        return null;
    }
}

4.策略工厂

package com.google.DesignPatterns.StrategyPattern.fact.factory;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;
import com.google.DesignPatterns.StrategyPattern.fact.PurposeEnum;

/**
 * @author wk
 * @Description:
 * @date 2019/12/24 14:09
 **/
public class FactApplyFactory {

    //使用策略工厂获取具体策略实现
    public static FactApplyStrategy getFactApplyStrategy(Integer code) {
        try {
            return (FactApplyStrategy) Class.forName(PurposeEnum.getEnumObjByCode(code).getClassName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

5.使用策略工厂获取具体策略实现

package com.google.DesignPatterns.StrategyPattern.fact.context;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;
import com.google.DesignPatterns.StrategyPattern.fact.factory.FactApplyFactory;

/**
 * @author wk
 * @Description:获取具体策略实现
 * @date 2019/12/24 14:03
 **/
public class FactContextStrategy {

    /**
     * 获取具体的策略实现
     * @param code
     * @return
     */
    public String toAddFact(Integer code) {
        //使用策略工厂获取具体的策略实现
        FactApplyStrategy factApplyStrategy = FactApplyFactory.getFactApplyStrategy(code);
        if (factApplyStrategy == null) {
            throw new RuntimeException("没有找到对应的策略实现");
        }
        return factApplyStrategy.toAddFact();
    }

    public static void main(String[] args) {
        System.out.println(new FactContextStrategy().toAddFact(2));
        System.out.println(new FactContextStrategy().toAddFact(3));
    }

}

输出:

跳转光大银行
跳转交通银行

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中结合策略模式枚举设计支付可以按照以下步骤进行: 1. 定义支付方式的枚举:创建一个枚举类,用于表示不同的支付方式。例如: ```java public enum PaymentMethod { ALIPAY, WECHATPAY, BANKCARD } ``` 2. 定义策略接口和实现类:创建支付策略接口和具体的支付策略实现类。在接口中定义支付方法实现类中实现具体的支付逻辑。例如: ```java public interface PaymentStrategy { void pay(BigDecimal amount); } @Component public class AlipayStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现支付宝支付逻辑 } } @Component public class WechatPayStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现微信支付逻辑 } } @Component public class BankCardStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现银行卡支付逻辑 } } ``` 3. 创建支付策略工厂类:创建一个支付策略工厂类,用于获取正确的支付策略对象。根据传入的支付方式枚举值,返回对应的支付策略对象。例如: ```java @Component public class PaymentStrategyFactory { @Autowired private AlipayStrategy alipayStrategy; @Autowired private WechatPayStrategy wechatPayStrategy; @Autowired private BankCardStrategy bankCardStrategy; public PaymentStrategy getPaymentStrategy(PaymentMethod paymentMethod) { switch (paymentMethod) { case ALIPAY: return alipayStrategy; case WECHATPAY: return wechatPayStrategy; case BANKCARD: return bankCardStrategy; default: throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod); } } } ``` 4. 在业务逻辑中使用支付策略:在需要使用支付功能的地方,通过支付策略工厂获取正确的支付策略对象,并调用支付方法进行支付。例如: ```java @Service public class PaymentService { @Autowired private PaymentStrategyFactory paymentStrategyFactory; public void processPayment(PaymentMethod paymentMethod, BigDecimal amount) { PaymentStrategy paymentStrategy = paymentStrategyFactory.getPaymentStrategy(paymentMethod); paymentStrategy.pay(amount); } } ``` 通过结合策略模式枚举设计支付,可以更加方便地管理和扩展支付方式,同时提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值