ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用策略模式或工厂模式代替if-else

2019-08-12 16:41:06  阅读:204  来源: 互联网

标签:money 模式 strategy 代替 PayStrategy 微信 else public


正文

业务场景:根据条件判断调用支付宝,微信,或其他第三方支付;

if(type==1){
        阿里支付();
 }else if(type==2){
        微信支付();
 }else{
        第三方支付();
 }

如果还有更多的支付类型,就在后面使用else if()这也太那啥了吧。。。

代码

公共代码

AliPayStrategy

/**
 * @author HJH
 * @Description: 支付宝
 * @date 2019/8/12 15:56
 */
public class AliPayStrategy implements PayStrategy {

    @Override
    public void pay(float money) {
        //调用支付宝的接口具体代码 略...
        if (money <= 200) {
            System.out.println("通过调用支付宝的接口" + "直接支付了" + money);
        } else {
            System.out.println("通过调用支付宝的接口" + "输入密码验证再支付了" + money);
        }
    }

}


WeChatPayStrategy

/**
 * @author HJH
 * @Description: 微信
 * @date 2019/8/12 15:57
 */
public class WeChatPayStrategy implements PayStrategy {

    @Override
    public void pay(float money) {
        //调用微信的接口略。。。。
        System.out.println("通过调用微信支付的接口支付了" + money);
    }

}


PayStrategy

/**
 * @author HJH
 * @Description: 从调用微信、支付宝、第三方等可以抽出一个公共的策略接口,同时也是为了实现定义中的互换
 * @date 2019/8/12 15:55
 */
public interface PayStrategy {
    public void pay(float money);
}

Client

/**
 * @author HJH
 * @Description:
 * @date 2019/8/12 16:01
 */
public class Client {

    public static void main(String[] args) {

//        if(type==1){
//            阿里支付();
//        }else if(type==2){
//            微信支付();
//        }else{
//            第三方支付();
//        }

        //结合策略模式
        ContextStrategy strategy = new ContextStrategy();
        strategy.setStrategy(new AliPayStrategy());
        strategy.payout(1000f);
        strategy.setStrategy(new WeChatPayStrategy());
        strategy.payout(20f);

        //结合简单工厂模式
        PayStrategy payStrategy = Factory.create(Factory.TYPE_ALI);
        payStrategy.pay(1000.0f);

        payStrategy = Factory.create(Factory.TYPE_WECHAT);
        payStrategy.pay(20.0f);

    }

}

使用策略模式

ContextStrategy

/**
 * @author HJH
 * @Description: 具体抽象类
 * @date 2019/8/12 15:55
 */
public class ContextStrategy {
    private PayStrategy strategy;

    public ContextStrategy() {

    }

    public void payout(float money) {
        strategy.pay(money);//调用策略
    }

    public void setStrategy(PayStrategy strategy) {
        this.strategy = strategy;//设置策略类
    }

}

使用工厂模式

/**
 * @author HJH
 * @Description: 负责实例化对应产品的对象
 * @date 2019/8/12 16:00
 */

//负责实例化对应产品的对象
public class Factory {
    public static final String TYPE_ALI="ali";
    public static final String TYPE_WECHAT="wechat";

    private Factory() {
    }
    public static PayStrategy create(String type){
        PayStrategy product=null;
        if(TYPE_ALI.equals(type)){
            product=new AliPayStrategy();
        }else if(TYPE_WECHAT.equals(type)){
            product=new WeChatPayStrategy();
        }
        return product;
    }
}

结语

其实代码很简单,无非也就是把判断条件与业务代码独立出来维护,减少了if else代码,提高代码的可阅读性与可维护性。缺点就是如果后期的策略过多(你懂的,类就很多),但是其实这点缺陷还是能容忍的。

标签:money,模式,strategy,代替,PayStrategy,微信,else,public
来源: https://blog.csdn.net/weixin_39388918/article/details/99308527

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有