在实际应用中有这样一个场景:有m台服务器,有n个任务,需要把这n个任务按一定策略分配给m台服务器来执行,请按以下要求实现该场景:
1、使用List列表代表服务器(列表中每个元素为一个IP地址);
2、使用List列表代表任务(列表中每个元素为任务ID);
3、分配的过程就是把IP地址与任务ID映射上的过程;
4、策略要支持多个,如按IP地址随机、按任务数量平分等,策略需要支持可扩展(扩展时不用修改已经实现好的策略);

1、实体类定义:

//服务器实体类
public class Service {private String IP;private String serviceName;}//任务实体类
public class Task {private Integer taskId;private String taskName;
}

2、抽象父类定义(所有的策略实现都需要继承该类)

public abstract class AbstractTaskAllocation {/*** 具体的整个过程 在这里定义操作实现的步骤*/protected void doTaskAllocation(List<Service> serverList, List<Task> taskList) {// 1、准备阶段,可以进行一些数据初始化的操作this.preparation(serverList, taskList);// 2、把IP地址与任务ID映射上阶段Map<Object, String> serviceTaskMapping = this.setMapping(serverList, taskList);// 3、结果返回阶段this.getResult(serviceTaskMapping);}/*** 1、准备阶段*/public abstract void preparation(List<Service> serverList, List<Task> taskList);/*** 2、把IP地址与任务ID映射上阶段* * @param taskList* @param serverList*/public abstract Map<Object, String> setMapping(List<Service> serverList, List<Task> taskList);/*** 3、结果返回阶段,分配完后续处理*/public void getResult(Map<Object, String> serviceTaskMapping){// 分配状态查询for (Entry<Object, String> entrySet : serviceTaskMapping.entrySet()) {System.out.println("服务器IP: " + entrySet.getValue() + " === 任务ID: " + entrySet.getKey());}}
}

3、平均分配策略:

public class AverageTaskAllocation extends AbstractTaskAllocation {// 进行一些参数校验之类的@Overridepublic void preparation(List<Service> serverList, List<Task> taskList) {if (serverList == null || serverList.size() < 1) {System.out.println("没有可用的服务器!");}if (taskList == null || taskList.size() < 1) {System.out.println("暂无需要处理的任务!");}}// 设置服务器和任务之间的隐射关系@Overridepublic Map<Object, String> setMapping(List<Service> serverList, List<Task> taskList) {// map key_value 的形式存储服务器和任务的映射关系 id : ip//Map<Object, String> serviceTaskMapping = new HashMap<Object, String>();Map<Object, String> serviceTaskMapping = new TreeMap<>();// 任务平均分配 参考HashMap 的分配原理int serverCount = serverList.size();for (int i = 0; i < taskList.size(); i++) {int taskAddress = i % serverCount;serviceTaskMapping.put(taskList.get(i).getTaskId(), serverList.get(taskAddress).getIP());//serviceTaskMapping.put(taskList.get(i).getTaskName(), serverList.get(taskAddress).getServiceName());}return serviceTaskMapping;}/*@Overridepublic void getResult(Map<Object, String> serviceTaskMapping) {// 分配状态查询for (Entry<Object, String> entrySet : serviceTaskMapping.entrySet()) {System.out.println("服务器IP: " + entrySet.getValue() + " === 任务ID: " + entrySet.getKey());}}*/
}

4、随机分配策略:

public class RandomTaskAllocation extends AbstractTaskAllocation {// 进行一些参数校验之类的@Overridepublic void preparation(List<Service> serverList, List<Task> taskList) {if (serverList == null || serverList.size() < 1) {System.out.println("没有可用的服务器!");}if (taskList == null || taskList.size() < 1) {System.out.println("暂无需要处理的任务!");}}// 设置服务器和任务之间的隐射关系@Overridepublic Map<Object, String> setMapping(List<Service> serverList, List<Task> taskList) {// map key_value 的形式存储服务器和任务的映射关系 id : ipMap<Object, String> serviceTaskMapping = new HashMap<Object, String>();// 设置的是随机事件 0或者1 各50%,保证随机分配性// 服务器的数量,就是任务分配的概率int serverCount = serverList.size();Random r = new Random();for (int i = 0; i < taskList.size(); i++) {Integer serverId = r.nextInt(serverCount);serviceTaskMapping.put(taskList.get(i).getTaskId(), serverList.get(serverId).getIP());}return serviceTaskMapping;}@Overridepublic void getResult(Map<Object, String> serviceTaskMapping) {// 可以覆盖父类,进行一些子类特殊操作}
}

5、测试类:

public class TaskAllocationTest {public static void main(String[] args) {List<Service> serverList = new ArrayList<>();List<Task> taskList = new ArrayList<>();// 添加服务器for (int i = 1; i < 11; i++) {Service service = new Service();service.setIP("10.1.10.3" + i);service.setServiceName("我是第"+i+"台服务器");serverList.add(service);}// 添加任务for (int i = 0; i < 500; i++) {Task task = new Task();task.setTaskId(i + 1);task.setTaskName("我是第"+i+"个任务");taskList.add(task);}// 随机分配策略:AbstractTaskAllocation randomTaskAllocation = new RandomTaskAllocation();randomTaskAllocation.doTaskAllocation(serverList, taskList);// 平均分配任务策略AbstractTaskAllocation averageTaskAllocation = new AverageTaskAllocation();averageTaskAllocation.doTaskAllocation(serverList, taskList);}
}

6、模板模式要点(不熟悉可以去看设计模式那节)

  • 模版方法定义了算法的步骤,把这些步骤的实现延迟到了子类。
  • 模版方法模式为我们提供了一种代码复用的重要技巧。
  • 模版方法的抽象类可以定义具体方法、抽象方法和钩子。
  • 抽象方法由子类实现。
  • 为了防止子类改变模版方法中的算法,可以将模版方法声明为final
  • 模版方法和策略模式都封装了算法,一个用组合(策略模式),一个用继承(模版方法)。

每天努力一点,每天都在进步。

模拟实现任务分配(模板模式)相关推荐

  1. 简易传染病模拟APP的设计与实现(模板模式+MVC模式)

    文章脉络 东湖->疫情->众生百态->what can I do for u->微博视频->技术栈->迎接挑战->设计->模型参考SERI->一行 ...

  2. 【设计模式】【行为型】模板模式之模拟去商场购物

    一.概念 1.1 概念 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计 ...

  3. java抽象类和模板模式_测试抽象类和模板方法模式

    java抽象类和模板模式 摘自Wikipedia,"模板方法定义了算法的程序框架. 子类可以覆盖一个或多个算法步骤,以允许不同的行为,同时确保仍然遵循总体算法." 通常,此模式由两 ...

  4. 浅谈 CRTP:奇异递归模板模式

    浅谈 CRTP:奇异递归模板模式 前言 建议先看一遍文末的参考资料! 建议先看一遍文末的参考资料! 建议先看一遍文末的参考资料! 思维导图 一.CRTP 是什么 CRTP 全称 : Curiously ...

  5. 行为模式(模板模式命令模式备忘录模式)

    目录 模板方法模式(Template) 介绍 实现 命令模式(Command) 介绍 实现 备忘录模式(Memento) 介绍 实现 模板方法模式(Template) 一个抽象类公开定义了执行它的方法 ...

  6. 设计模式(模板模式,命令模式,备忘录模式)

    目录 模板模式 什么是模板模式? 术语? 什么时候使用模板模式? 模板模式的优点? 模板模式的缺点? 角色? 钩子函数? 注意事项和细节? 什么场景使用模板模式? 案例: 命令模式 什么是命令模式? ...

  7. 九、委派模式与模板模式详解

    14.委派模式 14.1.课程目标 1 .掌握委派模式, 精简程序逻辑, 提升代码的可读性. 2.学会用模板方法模式梳理使用工作中流程标准化的业务场景. 14.2.内容定位 1 .希望通过对委派模式的 ...

  8. 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...

  9. java策略模式模板区别,策略模式与模板模式的区别

    已经很久没更新了,在这期间经历了准备面试.面试.离职又入职的过程,目前已经入职接近2个月,虽说从离职到入职只间隔了4天还包括一个周末.但入职后新工作这段时间还是给我带来了不一样的感悟,抽空我会单独&q ...

最新文章

  1. 【网络】通讯名词解释:带宽、速率、波特率、奈奎斯特定律、香农定理
  2. 用 Qt 给嵌入式Linux加个桌面
  3. oracle 数据库创建表
  4. python银行系统-python 银行系统
  5. 破解visual sourcesafe数据库admin用户密码
  6. 如何在一个站点里使用两个Web.sitemap 或是多个Web.sitemap?
  7. 哲学系列:《老子的智慧》、《吾国与吾民》、《从异教徒到基督教徒》、《佛教的精神与特色》、《禅与摩托车维修技术》、《人生的智慧》等读书笔记...
  8. 该如何来开发这个喜欢的功能呢?
  9. linux 串口是否可写,串口编程可写入不能读取 怎么解决
  10. 考研408复习思路,学习方法
  11. 【STM32F407的DSP教程】第13章 DSP快速计算函数-三角函数和平方根
  12. php色子,jQuery+PHP实现的掷色子抽奖游戏实例,jquery色子_PHP教程
  13. 转:教人找电影的攻略
  14. java咖啡系统,附源代码
  15. 百万年薪python之路 -- 软件的开发规范
  16. app store 注册账号生成证书上传app完整的教程
  17. 互联网日报 | 小米Q3营收净利创单季历史新高;字节跳动推出线下“松果门诊”;优客工场正式敲钟纳斯达克...
  18. 如何修改文件的 “创建时间” 和 “修改时间” (macOS, Linux, Windows) 2023 修正版
  19. 数据库原理与应用实验指导书 实验四:数据查询
  20. Mysql数据库详细教程

热门文章

  1. 虚拟经济:对网络前沿市场及社会的第一手统计(译)
  2. fiddler everywhere断点使用教程
  3. python三引号怎么换行_python三引号怎么使用
  4. webbrowser中localhost和发布的地址_发布一款android版博客园官方app
  5. 学习笔记(3):Python语言家族-了解Python函数
  6. Java 求1-100以内的所有素数,判断一个数是不是素数。Java代码实现附测试结果图
  7. 电商产品设计:会员系统
  8. ffmpeg 设置 改变 默认 音轨 声道 顺序 shell 懒人系列-23
  9. Principle of the Hardware-in-the-Loop (HIL)
  10. jq实现轮播图(景深效果)——功能实现