模拟实现任务分配(模板模式)
在实际应用中有这样一个场景:有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
- 模版方法和策略模式都封装了算法,一个用组合(策略模式),一个用继承(模版方法)。
每天努力一点,每天都在进步。
模拟实现任务分配(模板模式)相关推荐
- 简易传染病模拟APP的设计与实现(模板模式+MVC模式)
文章脉络 东湖->疫情->众生百态->what can I do for u->微博视频->技术栈->迎接挑战->设计->模型参考SERI->一行 ...
- 【设计模式】【行为型】模板模式之模拟去商场购物
一.概念 1.1 概念 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计 ...
- java抽象类和模板模式_测试抽象类和模板方法模式
java抽象类和模板模式 摘自Wikipedia,"模板方法定义了算法的程序框架. 子类可以覆盖一个或多个算法步骤,以允许不同的行为,同时确保仍然遵循总体算法." 通常,此模式由两 ...
- 浅谈 CRTP:奇异递归模板模式
浅谈 CRTP:奇异递归模板模式 前言 建议先看一遍文末的参考资料! 建议先看一遍文末的参考资料! 建议先看一遍文末的参考资料! 思维导图 一.CRTP 是什么 CRTP 全称 : Curiously ...
- 行为模式(模板模式命令模式备忘录模式)
目录 模板方法模式(Template) 介绍 实现 命令模式(Command) 介绍 实现 备忘录模式(Memento) 介绍 实现 模板方法模式(Template) 一个抽象类公开定义了执行它的方法 ...
- 设计模式(模板模式,命令模式,备忘录模式)
目录 模板模式 什么是模板模式? 术语? 什么时候使用模板模式? 模板模式的优点? 模板模式的缺点? 角色? 钩子函数? 注意事项和细节? 什么场景使用模板模式? 案例: 命令模式 什么是命令模式? ...
- 九、委派模式与模板模式详解
14.委派模式 14.1.课程目标 1 .掌握委派模式, 精简程序逻辑, 提升代码的可读性. 2.学会用模板方法模式梳理使用工作中流程标准化的业务场景. 14.2.内容定位 1 .希望通过对委派模式的 ...
- 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用
一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...
- java策略模式模板区别,策略模式与模板模式的区别
已经很久没更新了,在这期间经历了准备面试.面试.离职又入职的过程,目前已经入职接近2个月,虽说从离职到入职只间隔了4天还包括一个周末.但入职后新工作这段时间还是给我带来了不一样的感悟,抽空我会单独&q ...
最新文章
- 【网络】通讯名词解释:带宽、速率、波特率、奈奎斯特定律、香农定理
- 用 Qt 给嵌入式Linux加个桌面
- oracle 数据库创建表
- python银行系统-python 银行系统
- 破解visual sourcesafe数据库admin用户密码
- 如何在一个站点里使用两个Web.sitemap 或是多个Web.sitemap?
- 哲学系列:《老子的智慧》、《吾国与吾民》、《从异教徒到基督教徒》、《佛教的精神与特色》、《禅与摩托车维修技术》、《人生的智慧》等读书笔记...
- 该如何来开发这个喜欢的功能呢?
- linux 串口是否可写,串口编程可写入不能读取 怎么解决
- 考研408复习思路,学习方法
- 【STM32F407的DSP教程】第13章 DSP快速计算函数-三角函数和平方根
- php色子,jQuery+PHP实现的掷色子抽奖游戏实例,jquery色子_PHP教程
- 转:教人找电影的攻略
- java咖啡系统,附源代码
- 百万年薪python之路 -- 软件的开发规范
- app store 注册账号生成证书上传app完整的教程
- 互联网日报 | 小米Q3营收净利创单季历史新高;字节跳动推出线下“松果门诊”;优客工场正式敲钟纳斯达克...
- 如何修改文件的 “创建时间” 和 “修改时间” (macOS, Linux, Windows) 2023 修正版
- 数据库原理与应用实验指导书 实验四:数据查询
- Mysql数据库详细教程
热门文章
- 虚拟经济:对网络前沿市场及社会的第一手统计(译)
- fiddler everywhere断点使用教程
- python三引号怎么换行_python三引号怎么使用
- webbrowser中localhost和发布的地址_发布一款android版博客园官方app
- 学习笔记(3):Python语言家族-了解Python函数
- Java 求1-100以内的所有素数,判断一个数是不是素数。Java代码实现附测试结果图
- 电商产品设计:会员系统
- ffmpeg 设置 改变 默认 音轨 声道 顺序 shell 懒人系列-23
- Principle of the Hardware-in-the-Loop (HIL)
- jq实现轮播图(景深效果)——功能实现