设计模式-策略模式java实现

     2022-05-07     722

关键词:

策略模式简单来说就是将业务和实现业务的具体方法剥离开来

依然以仓库拣货来说,合并拣货分单拣货是一种模式,但具体根据所出库单中的品是什么类型,从哪种类型仓库出,还是要有具体的拣货策略来生成拣货列表

比如 服装仓按动线进行拣货,快消仓分整拣散拣,数码仓的品要扫码标记SN与单据关系出库

那么就要根据各种不同的仓库划分出不同的拣货列表创建方式,这样就把拣货这个业务本身,和具体拣货列表的生成进行剥离。不写死在具体业务中

首先建立策略模式的顶层接口
package strategy;

import java.util.List;

import bean.PickDoc;
import bean.PickList;

/**

  • 拣货策略顶层接口
  • @author zhousjmas@hotmail.com
  • */
    public interface IPickStrategy {

    public List<PickList> pickStrategy(List<PickDoc> list) ;

}

然后依次建立服装,数码,快消3种仓库的具体拣货列表策略
package strategy;

import java.util.List;

import bean.PickDoc;
import bean.PickList;

/**

  • 服装仓拣货策略
  • @author zhousjmas@hotmail.com
  • */
    public class ClothPickStrategy implements IPickStrategy {

    @Override
    public List<PickList> pickStrategy(List<PickDoc> list) {

    // TODO Auto-generated method stub
    System.out.println("根据单据展开服装仓拣货策略");
    
    return null;

    }

}

package strategy;

import java.util.List;

import bean.PickDoc;
import bean.PickList;

/**

  • 数码仓拣货策略
  • @author zhousjmas@hotmail.com
  • */
    public class DigitalPickStrategy implements IPickStrategy{

    @Override
    public List<PickList> pickStrategy(List<PickDoc> list) {

    // TODO Auto-generated method stub
    System.out.println("根据单据展开数码仓拣货策略");
    
    return null;

    }

}

package strategy;

import java.util.List;

import bean.PickDoc;
import bean.PickList;

/**

  • 快消仓拣货策略
  • @author zhousjmas@hotmail.com
  • */
    public class FmcgPickStrategy implements IPickStrategy{

    @Override
    public List<PickList> pickStrategy(List<PickDoc> pickDoc) {

    // TODO Auto-generated method stub
    System.out.println("根据单据展开快消仓拣货策略");
    
    return null;

    }

}

然后对以前定义的拣货接口进行修改,引入设置拣货策略的方法,依次修改合并拣货与分单拣货的实现
package builder;

import java.util.List;

import bean.PickDoc;
import bean.PickList;
import bean.PickTask;
import strategy.IPickStrategy;

/**

  • 定义要完成的动作
  • @author mas
  • */
    public interface IPickTask {

    //计算要拣货的SKU列表
    public List<PickList> getPickList(List<PickDoc> list);

    //计算拆分的拣货任务
    public List<PickTask> getPickTask(List<PickList> list);

    //设置拣货策略
    public void setPickStrategy(IPickStrategy pickStrategy);

}

然后进行示例调用
package strategy;

import java.util.ArrayList;
import java.util.List;

import bean.PickDoc;
import builder.IPickTask;
import builder.UnionPickTask;

public class PickStrategyMain {

public static void main(String[] args) {

    //拣货单据列表
    List<PickDoc> list = new ArrayList<PickDoc>();

    //假设当前是电子仓,要用电子仓的拣货策略
    IPickStrategy pickStrategy = new DigitalPickStrategy();

    //拣货模式为合并拣货
    IPickTask pickTask = new UnionPickTask();

    //设置拣货策略
    pickTask.setPickStrategy(pickStrategy);
    //获取拣货列表
    pickTask.getPickList(list);

}

}
调用效果
技术图片

这里会看到有个做静态代理演示代码的StaticPickTaskProxy.java报错。

这是因为这个静态代理类是要实现IPickTask这个顶层接口的所有方法,
这里就发现静态代理的缺点了。

另外也可以看到面向接口开发的优势,可以快速观察到所涉及业务子类的影响。如果不面向接口编程,那么可能会在大的业务调整时导致某些也涉及到业务的类被我们忽略修改,同时因为业务测试的分支难以覆盖而造成潜在隐患

java策略设计模式

...sp;  实际上不要被晦涩难懂的定义迷惑,其实策略设计模式就是定义一个接口,那么只要实现该接口的类,对这些方法进行实现,那么不同的实现类就完成了不同的算法逻辑,而使用该接口的地方,可以根据需要随意更改... 查看详情

策略设计模式详解c/java/js/go/python/ts不同语言实现

简介策略模式(StrategyPattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。当你想使用对象中各种不同的算法变体,使用if...else所带来的复杂和难以维护... 查看详情

设计模式中的多态——策略模式详解(代码片段)

目录1.关于策略模式2.策略模式详解2.1策略模式定义2.2策略模式的UML类图3.策略模式的优点3.1一个使用策略模式的例子3.2与其他实现方式的对比3.3使用策略模式的优点4.使用工厂方法模式改进原有策略模式5.总结5.参考资料1.关于策... 查看详情

java设计模式7.策略模式模板方法模式观察者模式

策略模式策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。环境角色:持有一个抽象策略角色的引用。抽象策略角色:... 查看详情

java设计模式---策略模式(案例解析)

策略模式一、概念1、理解策略模式策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一... 查看详情

java设计模式—策略模式

  在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模... 查看详情

java设计模式--策略模式

1.策略模式1.1定义策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。1.2底层机制将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现... 查看详情

java设计模式之策略模式

1.策略模式的介绍  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。简单的... 查看详情

java策略模式与接口直接实现

java策略模式例子:https://www.cnblogs.com/java2016/p/5386615.htmlContextcontext=newContext(newAddStrategy());System.out.println(context.calculate(10,5));与Strategys=newAddStrategy();s.calcuate(10,5);的优劣怎么比较?谢谢!我是一个java初学者,我下面写的东西都是我... 查看详情

java策略模式

策略模式策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。这个模式涉及到三个... 查看详情

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

温故而知新,每次读设计模式都会有不同的体验,坚持每天一个设计模式,直到熟练运用设计模式。策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。... 查看详情

10设计模式策略模式

前言在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的策略模式的思想,... 查看详情

java设计模式1-策略模式

策略模式:分别封装行为接口,实现算法族,超类里放行为的接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.为什么要用策略模式{继承带来的问题:(为策略模式)对类的局部改动,尤其是... 查看详情

java设计模式之——策略模式

1、策略模式有什么好处?    策略模式的好处在于你可以动态的改变对象的行为。2、设计原则    设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类... 查看详情

设计模式系列——策略模式(代码片段)

原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及个人成长。策略模式常用于一个对象的行为在运行时有多个不同的策略和算法。举个例子可以通过实现一个加、减、乘三种不用策略的运算,... 查看详情

设计模式----------策略模式

策略模式,不讲过多的废话。我们来直接看代码。1、我们先定一个接口packagecom.guoguo.celvemoshi;/***定义一个策略接口*@author蝈蝈**/publicinterfaceStrategyService{//定义一个可执行方法publicvoidexecute();}2、策略的具体实现(java多态---不懂先... 查看详情

day321.策略模式&职责链模式-java设计模式(代码片段)

策略模式将原本继承的方式,换成组合、聚合,让算法变化(策略)与算法客户(对象)分离一、编写鸭子项目,具体要求如下:1)有各种鸭子(比如野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等)2)显示鸭... 查看详情

java设计模式之策略学习与掌握(代码片段)

...结构与实现模式的结构模式的实现应用场景前言个人建议设计模式这一系列的文章,多关注定义和模式的代码实现。至于模式结构和扩展或者是应用场景,基本了解过一下就好,没必要硬记。这只是我的个人建议࿰... 查看详情