码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式

时间:2019-09-01 18:19:40      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:code   相同   @param   err   eve   ref   onclick   软件   span   

1、策略模式:策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,

只是实现不同,他可以以相同的方式来调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

 

2、题目:做一个商场收银软件,营业员根据客户所购买的商品的单价和数量,向客户收费,收费模式分三种:第一种,正常收费;

 第二种,打8折;第三种,满300送100;

 

3、UML图

技术图片



4、示例代码

4.1、抽象算法类:

CashSuper类:
技术图片
package com.aibaiyang.idemo.service.strategy;

/**
 * @Author zhong guo
 * @Date 2019/8/30 11:44
 * @description 抽象算法类
 **/
public abstract class CashSuper {

    //现金收取算法方法
    public abstract double acceptCash(double money);

}
View Code
CashNormal类:
技术图片
package com.aibaiyang.idemo.service.strategy;

/**
 * @Author zhong guo
 * @Date 2019/8/30 11:50
 * @description 正常收费
 **/
public class CashNormal extends CashSuper{

    @Override
    public double acceptCash(double money) {
        return money;
    }

}
View Code
CashRebate类:
技术图片
package com.aibaiyang.idemo.service.strategy;

import lombok.Data;

/**
 * @Author zhong guo
 * @Date 2019/8/30 11:51
 * @description 打折收费子类
 **/
@Data
public class CashRebate extends CashSuper{

    //折扣率
    private double moneyRebate;

    //构造方法
    public CashRebate(double moneyRebate){
        this.moneyRebate = moneyRebate;
    }

    @Override
    public double acceptCash(double money) {
        return money * moneyRebate;
    }

}
View Code
CashReturn类
技术图片
package com.aibaiyang.idemo.service.strategy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @Author zhong guo
 * @Date 2019/8/30 11:56
 * @description 返利类子类
 **/
@Data
@AllArgsConstructor
@Accessors(chain = true)
public class CashReturn extends CashSuper{

    //返利条件
    private double moneyCondition;

    //返利值
    private double moneyReturn;

    @Override
    public double acceptCash(double money) {

        //若钱大于返利条件,则减去返利值
        if(money >= moneyCondition){
            money = money - moneyReturn;
        }
        return money;
    }


}
View Code

 

4.2、上下文类:

CashContext类:
技术图片
package com.aibaiyang.idemo.service.strategy;

/**
 * @Author zhong guo
 * @Date 2019/8/30 12:34
 * @description
 **/
public class CashContext {

    private CashSuper cs;

    public CashContext(Integer type){
        switch (type){

            case 1:
                cs = new CashNormal();
                break;

            case 2:
                cs = new CashRebate(0.8);
                break;

            case 3:
                cs = new CashReturn(300f ,100f);
                break;
        }

    }

    /**
     * 得到结果
     * @param money
     * @return
     */
    public double getResult(double money){
        return cs.acceptCash(money);
    }

}
View Code

 

4.3、其它相关类:

技术图片
package com.aibaiyang.idemo.enums;

/**
 * 策略模式枚举类型
 */
public enum StrategyEnum {

    ONE(1,"正常收费"),
    TWO(2,"打8折收费"),
    THREE(3,"满300返100收费");

    private Integer type;

    private String description;

    StrategyEnum(Integer type, String description) {
        this.type = type;
        this.description = description;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
View Code

 

4.4、策略模式客户端:

技术图片
package com.aibaiyang.idemo.service.strategy;

import com.aibaiyang.idemo.enums.StrategyEnum;

/**
 * @Author zhong guo
 * @Date 2019/8/30 12:46
 * @description 策略模式客户端
 **/
public class StrategyClient {

    public static void main(String[] args) {

        CashContext cashContext = new CashContext(StrategyEnum.ONE.getType());
        double totalMoney = cashContext.getResult(253f  * 3);
        System.out.println(totalMoney);

    }

}
View Code

 

5、github: idemo-design-parttern/service/strategy

 

策略模式

标签:code   相同   @param   err   eve   ref   onclick   软件   span   

原文地址:https://www.cnblogs.com/aibaiyang/p/11442850.html

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