java 之 策略模式(大话设计模式)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 之 策略模式(大话设计模式)相关的知识,希望对你有一定的参考价值。

温故而知新,每次读设计模式都会有不同的体验,坚持每天一个设计模式,直到熟练运用设计模式。

策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。

以下是大话设计模式的策略类图

技术分享图片

/**
 * 上下文
 */
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public Double getResult() {
        return strategy.getResult();
    }
}

 

 

/**
 * 策略接口
 */
public interface Strategy {

    public Double getResult();
}

 

  

/**
 * (具体策略类)原价策略
 */
public class StrategyA implements Strategy{

    private Double money;

    public StrategyA(Double money) {
        this.money = money;
    }

    @Override
    public Double getResult() {

        return money;
    }

}

 

 

/**
 * (具体策略类)折扣策略
 */
public class StrategyB implements Strategy{

    private Double money;

    private Double discount;

    public StrategyB(Double money, Double discount) {
        this.money = money;
        this.discount = discount;
    }

    @Override
    public Double getResult() {

        return money * discount;
    }

}

 

 

/**
 * (具体策略类)满减策略
 */
public class StrategyC implements Strategy{

    private Double money;

    private Double subMoney;

    public StrategyC(Double money, Double subMoney) {
        this.money = money;
        this.subMoney = subMoney;
    }

    @Override
    public Double getResult() {

        if (money > subMoney) {
            return money - subMoney;
        }
        return money;
    }

}

 

 

/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) {
        Context contextA = new Context(new StrategyA(60d));
        System.out.println(contextA.getResult());
        Context contextB = new Context(new StrategyB(60d, 0.8d));
        System.out.println(contextB.getResult());
        Context contextC = new Context(new StrategyB(60d, 10d));
        System.out.println(contextC.getResult());
    }
}

 

 

以上是策略模式的一个demo,不过现在客户端还是要知道具体使用哪个策略,还是存在耦合,如果用简单工厂模式和策略模式结合

思考下,我们不需要改变策略类,而是希望改变客户端,让客户端不在去知道具体new哪个对象于是下面我们改造下客户端和上下文,让上下文帮我们选择具体策略。

 

上下文代码改造后

 

/**
 * 上下文
 */
public class Context {

    private Strategy strategy;

    /**
     * @param type 策略类型
     * @param money 价钱
     * @param subMoney 满减价钱
     * @param discount 折扣
     */
    public Context(String type, Double money, Double subMoney, Double discount) {

        switch (type) {
        case "折扣":
            strategy = new StrategyB(money, discount);
            break;
        case "满减":
            strategy = new StrategyC(money, subMoney);
            break;
        default:
            strategy = new StrategyA(money);
            break;
        }
    }

    public Double getResult() {
        return strategy.getResult();
    }
}

 

 

客户端代码

/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) {
        Context contextA = new Context("原价", 60d, null, null);
        System.out.println(contextA.getResult());

        Context contextB = new Context("折扣", 60d, null, 0.8d);
        System.out.println(contextB.getResult());

        Context contextC = new Context("满减", 60d, 10d, null);
        System.out.println(contextC.getResult());
    }
}

 

这样就实现了简单工厂模式和策略模式的结合,客户端只需要直接创建一个上下文,而不需要知道具体去创建的哪个对象。实际工作中很多业务模型都可以抽象成策略加工厂模式,对策略模式理解不同层次会有不同的认识,

逐渐的会发现大话设计模式不仅仅可以应用在代码层次,还可以上升到公司的业务模型等!

以上希望能够帮助学习策略模式的小伙伴!

 

以上是关于java 之 策略模式(大话设计模式)的主要内容,如果未能解决你的问题,请参考以下文章

大话设计模式之策略模式

大话设计模式之策略模式

大话设计模式之策略模式

大话设计模式之策略模式读后感

java 之 状态模式(大话设计模式)

大话设计模式-策略模式(大鸟和小菜Java版)