java设计模式之策略模式

个人资源分享网站:http://xiaocaoshare.com/

策略模式属于行为型模式

java设计模式之策略模式_第1张图片

根据目的、用途的不同,分为创建性模式、结构性模式、行为性模式

创建型模式主要用于创建对象,结构型模式主要用于处理类和对象的组合,行为性模式主要用于描述类或对象的交互以及职责分配。

根据处理范围不同,设计模式又可分为类模式和对象模式,类模式处理类与子类的关系,通过处理这些关系来建立继承,属于静态关系,在编译时候确定下来;对象模式处理对象之间的关系,运行时发生变化,属于动态关系。

1.创建型设计模式(5种)

2.结构型设计模式(7种)

3.行为性模式(11种)

策略模式是对算法的包装,把使用算法的责任和算法本身分割开来,委派给不同的对象管理

实现方式:

1.创建一个父接口,就是抽象策略类,定义策略方法(算法)

2.定义不同算法的实现类

3.客户端根据使用场景进行调用

 

应用场景:如:商品促销实现收取现金方式:

方式1:正常收取现金

方式2:打折收取现金

方式3:让利返现 收取现金

1.创建父接口

/**
 * @ClassName ICashSuper
 * @Description TODO
 * @Author xiaoss
 * @Date 2020/7/29 16:50
 * @VERSION 2.0
 */
public interface ICashSuper {

    /**
     * 收取现金的方法
     * @param money
     * @return
     */
    double acceptCash(double money);
}

2.创建对应实现类

2.1

/**
 * @ClassName CashNormal
 * @DESCRIPTION 正常收取现金
 * @Author xiaoss
 * @Date 2020/7/29 16:51
 * @VERSION 2.0
 */

public class CashNormal implements ICashSuper{

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

 

2.2

/**
 * @ClassName CashRebate
 * @DESCRIPTION 打折收取现金
 * @Author xiaoss
 * @Date 2020/7/29 16:52
 * @VERSION 2.0
 */

public class CashRebate implements  ICashSuper{

    private double rebate; //折扣
    public CashRebate (double rebate) {
        this.rebate = rebate;
    }


    @Override
    public double acceptCash(double money) {
        return new BigDecimal(money * rebate / 10).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}

 

2.3

/**
 * @ClassName CashReturn
 * @DESCRIPTION 让利返现
 * @Author xiaoss
 * @Date 2020/7/29 16:53
 * @VERSION 2.0
 */


public class CashReturn implements  ICashSuper{

    private double moneyCondition; //返现底限金额
    private double returnMoney; //返还金额

    public CashReturn(double moneyCondition, double returnMoney) {
        this.moneyCondition = moneyCondition;
        this.returnMoney = returnMoney;
    }

    @Override
    public double acceptCash(double money) {
        if (money >= moneyCondition) {
            return money - Math.floor(money / moneyCondition) * returnMoney;
        } else {
            return money;
        }

    }
}

 

3.定义操作类

/**
 * @ClassName CashContext
 * @DESCRIPTION 操作类
 * @Author xiaoss
 * @Date 2020/7/29 16:55
 * @VERSION 2.0
 */
public class CashContext  {

    private ICashSuper casher;

    public CashContext() {

    }

    public CashContext(ICashSuper casher) {
        this.casher = casher;
    }

    public void setCasher(ICashSuper casher) {
        this.casher = casher;
    }

    //依据详细的策略对象,调用它的算法行为
    public double acceptCash(double money) {
        return this.casher.acceptCash(money);
    }

}

4、执行

@SpringBootApplication
public class TestApplication {



    public  static void main(String[] args) {

        SpringApplication.run(TestApplication.class, args);
        double money = 998; //原价
        CashContext cashContext = new CashContext(new CashNormal());
        System.out.println("原价:" + cashContext.acceptCash(money)); //通常  策略

        cashContext.setCasher(new CashRebate(8.5));
        System.out.println("打85折:" + cashContext.acceptCash(money)); //折扣   策略   85折

        cashContext.setCasher(new CashReturn(300, 50));
        System.out.println("满300 返50:" + cashContext.acceptCash(money)); //返现  策略    满300 返50



    }

}

运行结果:

原价:998.0
打85折:848.3
满300 返50:848.0

你可能感兴趣的:(设计模式)