码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA设计模式之策略模式

时间:2019-12-06 11:15:00      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:first   out   pre   ams   开放   adf   定义   actor   err   

策略模式
定义了算法族,分别封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

使用场景
电商行业里的支付模式,一般分为银联、支付宝、微信,一种业务,多种实现方式,如果哪种发生变化
只要修改对应的实现即可,未来引入新的支付,例如积分支付,增加一个实现类,而不需要改变现有代码。
遵循原则
1. 开闭原则:对扩展开放,对修改关闭
2. 针对接口编程,而不是针对实现编程
示例:

 

package com.study.headfirst.strategy;

/**
 * @author mdl
 * @date 2019/12/06
 */
public interface Payment {

    /**
     * 发起支付
     * 
     * @param params
     */
    public Object gotoPay(Object...params);
    
    /**
     * 支付回写
     * 
     * @param params
     */
    public void notify(Object...params);
    
}

 

package com.study.headfirst.strategy;

/**
 * 支付宝
 * 
 * @author mdl
 * @date 2019/12/06
 */
public class Alipay implements Payment{

    /* (non-Javadoc)
     * @see com.study.headfirst.strategy.Payment#gotoPay(java.lang.Object[])
     */
    @Override
    public Object gotoPay(Object... params) {
        System.out.println("开始调用支付宝支付...");
        return null;
    }

    /* (non-Javadoc)
     * @see com.study.headfirst.strategy.Payment#notify(java.lang.Object[])
     */
    @Override
    public void notify(Object... params) {
        // TODO Auto-generated method stub
         
    }

}
package com.study.headfirst.strategy;

/**
 * 微信支付
 * 
 * @author mdl
 * @date 2019/12/06
 */
public class WechatPay implements Payment{

    /* (non-Javadoc)
     * @see com.study.headfirst.strategy.Payment#gotoPay(java.lang.Object[])
     */
    @Override
    public Object gotoPay(Object... params) {
        System.out.println("开始调用微信支付...");
        return null;
    }

    /* (non-Javadoc)
     * @see com.study.headfirst.strategy.Payment#notify(java.lang.Object[])
     */
    @Override
    public void notify(Object... params) {
        // TODO Auto-generated method stub
         
    }

}
package com.study.headfirst.strategy;

/**
 * @author mdl
 * @date 2019/12/06
 */
public class PayFactory {
    
    private Payment payment;

    PayFactory(Payment payment){
        this.payment = payment;
    }
    
    
    public Object gotoPay(Object... params) {
        payment.gotoPay(params);
         return null;
    }

    
    public void notify(Object... params) {
        payment.notify();
    }
    
}

编写测试类:

package com.study.headfirst.strategy;

/**
 * @author mdl
 * @date 2019/12/06
 */
public class Test {

    public static void main(String[] args) {
        // 这里只谈策略模式,学习了工厂模式之后,这里应设计成根据前端传入的支付类型
        // 如 1 代表支付宝,2 代表微信,以此获取具体的支付方式,且此方法在PayFactory定义
        PayFactory factory =new PayFactory(new Alipay());
        factory.gotoPay(new Object[] {"1"});
        
        factory =new PayFactory(new WechatPay());
        factory.gotoPay(new Object[] {"2"});
    }
    
}

技术图片

 

JAVA设计模式之策略模式

标签:first   out   pre   ams   开放   adf   定义   actor   err   

原文地址:https://www.cnblogs.com/bloodthirsty/p/11993910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!