美高梅平台下载-美高梅娱乐平台登录

热门关键词: 美高梅平台下载,美高梅娱乐平台登录

代码会变成什么样,可以使用策略模式

日期:2019-10-06编辑作者:美高梅平台下载

图片 1策略.jpg

本文仅仅为入门,高手勿喷。

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式让算法独立于使用它的客户而独立变化。策略模式重点是封装不同的算法和行为,不同的场景下可以相互替换。策略模式是开闭原则的体现,开闭原则讲的是一个软件实体应该对扩展开放对修改关闭。策略模式在新的策略增加时,不会影响其他类的修改,增加了扩展性,也就是对扩展是开放的;对于场景来说,只依赖于抽象,而不依赖于具体实现,所以对修改是关闭的。策略模式的认识可以借助《java与模式》一书中写到诸葛亮的锦囊妙计来学习,在不同的场景下赵云打开不同的锦囊,便化险为夷,锦囊便是抽象策略,具体的锦囊里面的计策便是具体的策略角色,场景就是赵云,变化的处境选择具体策略的条件。策略模式可以有效的避免过多的if-else的出现。

实际工作中,我们总会遇到类似如下的需求:
某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统的结算比例不一样,而且 同一家商户的不同充值方式也有所不同,具体系统情况比较复杂,像支付宝既有支付宝账号支付和支付宝网银支付等这些暂时不考虑,为了讲述策略模式这里简单描 述,假如分为四种,手机支付,网银支付,商户账号支付和点卡支付。因为没个支付结算比例不同,所以对手续费低的做一些优惠活动,尽可能让用户使用手续费低 的支付方式来充值,这样降低渠道费用,增加收入,具体优惠政策如下:

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用。

下面通过一个策略模式的UML图表示:[图片上传失败...(image-236cbe-1517582099931)]图2-1 策略模式UML图

网银充值,8.5折
商户充值,9折
手机充值,没有优惠
点卡充值,收取1%的渠道费

适用范围:

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用。

作为一个新手的代码基本如下:

• 许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
• 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
• 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
• 一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

根据现在广大人民都喜欢vip来举例子吧。

public class Example {
    public Double calRecharge(Double charge ,RechargeTypeEnum type ){

       if(type.equals(RechargeTypeEnum.E_BANK)){
           return charge*0.85;
       }else if(type.equals(RechargeTypeEnum.BUSI_ACCOUNTS)){
           return charge*0.90;
       }else if(type.equals(RechargeTypeEnum.MOBILE)){
           return charge;
       }else if(type.equals(RechargeTypeEnum.CARD_RECHARGE)){
           return charge+charge*0.01;
       }else{
           return null;
       }

    }

} 

public enum RechargeTypeEnum {

    E_BANK(1, "网银"),

    BUSI_ACCOUNTS(2, "商户账号"),

    MOBILE(3,"手机卡充值"),

    CARD_RECHARGE(4,"充值卡")
    ;


    private int value;


    private String description;



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

    public int value() {
       return value;
    }
    public String description() {
       return description;
    }


    public static RechargeTypeEnum valueOf(int value) {
        for(RechargeTypeEnum type : RechargeTypeEnum.values()) {
            if(type.value() == value) {
                return type;
            }
        }
        return  E_BANK;
    }
}

下面通过一个简单的案列讲解

  • 一级vip 9折
  • 二级vip 8折
  • 三级vip 7折

以上代码虽然实现了基本功能,但是四种计算方式都在一个方法内部,如果优惠模式又增加了几十种,代码会变成什么样?你是否愿意来维护和扩展这样的代码?此时有的同学或许会说,我用switch-case来实现:

例:

常规的方法来展示:

public class Example {
    public Double calRecharge(Double charge ,RechargeTypeEnum type ){

      switch(type){
        case RechargeTypeEnum.E_BANK:
            return charge*0.85;
        case RechargeTypeEnum.BUSI_ACCOUNTS:
            return charge*0.90;
        case RechargeTypeEnum.MOBILE:
            return charge;  
        case RechargeTypeEnum.CARD_RECHARGE:
            retrun charge+charge*0.01;
        default:
        return null;
      }

    }

} 

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 JAVA 程序怎么表现这个呢?我们先看类图:
图片 2

public class VIP { enum VipType { one,two,three } double getMoney(double money,VipType type){ switch { case one: return money*0.9; case two: return money*0.8; case three: return money*0.7; } return money; }}

这段代码在简洁性确实要比if-else简洁一些,但实际上是换汤不换药,并没有从本质上解决问题。
我们使用if-else事实上也是为了重用,但这只是面向过程的重用,程序员只看到代码重用,因为他看到if-else几种情况下大部分代码都是重复的,只有个别不同,因此使用if-else可以避免重复代码,并且认为这是模板Template模式。我们会从代码运行顺序来看待代码,这种思维类似水管或者串行电路,水沿着水管流动(代码运行次序),当遇到几个分管(子管),就分到这几个分管子在流动,这里就相当于碰到代码的if-else处了。这样的坏处就是,一旦业务发生了变化将给我们维护工作带来极大的困难。
那么有没有更好的实现方式呢?当然有,我们可以通过工厂模式或者策略模式避免如上的面向过程的重用。而本文将要介绍的是 策略模式

三个妙计是同一类型的东东,那咱就写个接口:

创建一个计算钱的类,根据输入的参数,使用switch来完成。


package com.oumyye.策略模式;
/**
* @author 
* I'm glad to share my knowledge with you all.
* 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
*
*/
public interface IStrategy {
 //每个锦囊妙计都是一个可执行的算法
public void operate();
}

本文由美高梅平台下载发布于美高梅平台下载,转载请注明出处:代码会变成什么样,可以使用策略模式

关键词:

prototype.(用原型实例指定创建对象的种类,但是

原型模式 一. 概念 定义:Specify the kinds of objects to create using a prototypicalinstance,and create new objects by copying thisprototype.(...

详细>>

对于扩展的话,通知观察者来扩展功能

咖啡店,客户可能会叫一种饮料,并且指定某些调料加入进去,比如深焙咖啡,用摩卡,奶泡,牛奶作为调料,计算...

详细>>

这些角色都是淘宝这个面上的不同的点,公众号

前言: 【发光weekly】是Dove新启动的周刊,以每周一篇的形式分享近期所学内容,既是一个干货记录平台,也是与大家...

详细>>

其实我想说,软件工程师要做的工作就是写代码

当你完全驾驭了计算机的输入设备以后,你需要进一步了解计算机的内部工作原理,不是让你把机器大卸八块,而是...

详细>>