zoukankan      html  css  js  c++  java
  • 设计模式 | 第一篇:策略模式

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

    使用场景
    电商行业里的支付模式,一般分为银联、支付宝、微信,一种业务,多种实现方式,如果哪种发生变化
    只要修改对应的实现即可,未来引入新的支付,例如积分支付,增加一个实现类,而不需要改变现有代码。
    遵循原则
    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"});
        }
        
    }

    每一步脚印都要扎得深一点!
  • 相关阅读:
    ASP.NET MVC 5 安全性和创建用户角色
    使用ENTITY FRAMEWORK 6以正确的方式管理DBCONTEXT:深入指南
    C#读取二进制格式的shapefile
    ASP.NET MVC 应用程序初学者常见问题汇总
    ASP.NET MVC 应用程序中使用CKEditor 4 的步骤
    html5学习笔记2
    html5学习笔记
    c#接口定义与应用
    Django ORM 优化心得
    携程的那点事
  • 原文地址:https://www.cnblogs.com/bloodthirsty/p/11993910.html
Copyright © 2011-2022 走看看