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

     2022-03-26     742

关键词:

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

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

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

技术分享图片

/**
 * 上下文
 */
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());
    }
}

 

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

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

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

 

大话设计模式之策略模式(代码片段)

背景:商场促销期间,可能会出现8折、5折的促销活动,也可能出现满100减10、满200减30的促销活动,设计一个收银系统。策略模式:定义了算法家族,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。... 查看详情

大话设计模式之策略模式读后感(代码片段)

策略模式:定义了算法家族,分别封装起来,让他们呢之间可以互相的替换,此模式让算法的变化不会影响到使用算法的客户。UML类图:解读:策略模式是定义一系列的算法,从概念上来讲,这些算法完成的工作都是一样的,只... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

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

看过大话设计模式的小伙伴,都知道大话设计模式中的demo代码不是JAVA的,对于编程来说,设计模式不限于任何语言,讲述的是编程的思想。今天笔者再次看这篇文章时,看了下别人的博客对于设计模式的理解,希望能汲取点其... 查看详情

java之备忘录模式(大话设计模式)

...会经常用到吧!当然这只是笔者的推断。先看下类图大话设计模式-类图再继续看下Demo吧/***需要保存的进度信息类*/publicclassRoleSateMemento{privateIntegeratk;privateIntegervit;privateIntegerattack;publicRoleS 查看详情

java之模板模式(大话设计模式)

...用过,而且大家都比较喜欢这个模式,先看一下类图大话设计模式-类图作为一个程序员,不懂得“偷懒“,在笔者看来不是很合格哦!当我们编写程序时,发现很多个类所走的流程基本一致,只是少部分差异,这时我们就需要... 查看详情

java之命令模式(大话设计模式)

...比较频繁时,自然而然就用到命令模式。先看下类图大话设计模式-类图简单说下类图,最开始笔者看大话设计模式的时候也不是很喜欢看类图,主要原因是看不懂,后来当笔者第一次看完设计模式后,才真正意义上的理解类图... 查看详情

<二>读<<大话设计模式>>之策略模式

...不错,好好加油。      <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了。哪家商场收银软件强,开玩笑了。读过上篇文章《《简单工厂模式》》的知道,它有两个缺点... 查看详情

java之桥接模式(大话设计模式)

...它的实现部分分离,使它们都可以独立的变化。第一次看设计模式的时候,不是很清楚这句话的意思,随着笔者的不断开发,发现有一种场景,继承关系多了,不易于维护父类,而笔者认为桥接模式的出现很好的解决了这个问题... 查看详情

java之代理模式(大话设计模式)

...买可乐就是需要做的行为。这是笔者理解的代理模式大话设计模式-类图要想实现代理,那么代理类和被代理的类就都要实现一个共同的接口,就刚刚买可乐的例子,我和我的室友都可以买可乐。代理类可以动态的去做一些事情... 查看详情

java之抽象工厂模式(大话设计模式)

...们还是要吸取其思想而不是生搬硬套。来看下类图:大话设计模式-类图看类图已经很乱了,来简单的梳理下。我们只看接口,这样就不难看出实际上是抽象工厂生产抽象产品的过程,而具体实现都是各自的实现类来做。看下具... 查看详情

java之观察者模式(大话设计模式)

...利集合调取公共方法去完成相应的工作,先看下类图大话设计模式-类图基于类图笔者写了 查看详情

java之外观模式(大话设计模式)

外观设计模式,很多人都已经使用过,只是不知其名,一般一个很nice的系统,模块化做的都很不错,这样如果新来一个业务,只需要把各个模块组装起来就可以满足新的业务,从程序的角度来说,就是我们只需要开一个类,然... 查看详情

大话设计模式——策略模式

一、开篇  上篇文章【大话设计模式】——简单工厂模式告诉了我们一个网吧收费工厂对象怎样创建收费形式(白天收费、夜间收费)的实例。简单工厂代码中有非常多case分支语句 ,假设我们还想填加收费的形式(比方会... 查看详情

大话设计模式--策略模式(代码片段)

策略模式(Strategy):定义了算法家族,分别封装起来,让各个算法之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。/***策略,定义计算报价算法的接口**/publicinterfaceStrategy/**... 查看详情

《大话设计模式》——读后感商场促销?——策略模式

...对商场促销进行各种各样的打折进行设计案例的,而大话设计模式中还提到:  等等,打折、返现等等一系列促销具体方式 查看详情

大话设计模式读书笔记--2.策略模式

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类定义它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算... 查看详情

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情