设计模式之职责链模式应用例题

  • 题目描述
  • 类结构图及相关说明
  • 程序代码
  • 运行结果

题目描述

在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军情(如敌人的数量),作战命令需要上级批准,如果直接上级不具备下达命令的权力,则上级又传给上级,直到有人可以决定为止。现使用职责链模式来模拟该过程,客户类(Client)模拟情报人员,首先向级别最低的班长(Banzhang)递交任务书(Mission),即军情,如果超出班长的权力范围,则传递给排长(Paizhang),排长如果也不能处理则传递给营长(Yingzhang),如果营长也不能处理则需要开会讨论。我们设置这几级长官的权力范围分别是:
①敌人数量<10,班长下达作战命令。
②10≤敌人数量<50,排长下达作战命令。
③50≤敌人数量<200,营长下达作战命令。
④敌人数量≥200,需要开会讨论再下达作战命令。
请使用职责链模块实现,绘制类图、类图说明并编程实现。

类结构图及相关说明


Officer类:抽象处理者,设计为抽象类,由于不同的具体处理者Banzhang类、Paizhang类、Yingzhang类处理请求的方法不同,因此在其中定义了抽象请求处理方法sendMission()。每一个处理方法的下家还是一个处理者,故在抽象处理者Officer类中定义了一个抽象处理者类型的对象officer作为其对下家的引用,通过该引用处理中可以连成一条链。通过链式调用将任务层层下发。
Banzhang类:具体处理者,是抽象处理者Officer类的子类,可以处理用户的请求Mission类,在具体处理者类Banzhang类中实现了抽象处理者Officer类中定义的抽象请求处理方法sendMission(),在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者,在具体处理者Officer类中可以访问链中的下一个对象,以便请求的转发。
Paizhang类:具体处理者,是抽象处理者Officer类的子类,可以处理用户的请求Mission类,在具体处理者类Paizhang类中实现了抽象处理者Officer类中定义的抽象请求处理方法sendMission,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者,在具体处理者Officer类中可以访问链中的下一个对象,以便请求的转发。
Yingzhang类:具体处理者,是抽象处理者Officer类的子类,可以处理用户的请求Mission类,在具体处理者类Yingzhang类中实现了抽象处理者Officer类中定义的抽象请求处理方法sendMission(),在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者,在具体处理者Officer类中可以访问链中的下一个对象,以便请求的转发。
Mission类:设置任务内容及敌人数量,充当请求类。

程序代码

Mission类

//充当请求类
public class Mission {private String soldierName; //情报人员private int enemyNumber; //敌人数量public Mission(){super();}public Mission(String soldierName, int enemyNumber){super();this.soldierName = soldierName;this.enemyNumber = enemyNumber;}public String getSoldierName() {return soldierName;}public void setSoldierName(String soldierName) {this.soldierName = soldierName;}public int getEnemyNumber() {return enemyNumber;}public void setEnemyNumber(int enemyNumber) {this.enemyNumber = enemyNumber;}
}

Officer类

//抽象处理者,抽象类,
public abstract class Officer {protected  String name; //定义一个抽象处理者类的对象,作为其对下家的引用protected Officer officer; //维持对下家的引用public Officer(String name){this.name = name;}public void setOfficer(Officer officer) {this.officer = officer;}//声明抽象的的请求方法,具体实现交由子类完成public abstract void sendMission(Mission mission);
}

Banzhang类

//具体处理者,是抽象处理者的子类,可以处理用户请求,并实现抽象处理者中定义的抽象请求处理方法
public class Banzhang extends Officer{public Banzhang(String name){super(name);}@Overridepublic void sendMission(Mission mission) {//请求满足条件if(mission.getEnemyNumber()>0 && mission.getEnemyNumber()<10){//处理请求//敌人数量<10,班长下达作战命令System.out.println("班长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为:"+mission.getEnemyNumber()+",可以下达作战指令");}else{if(this.officer!=null){this.officer.sendMission(mission); //转发请求}}}
}

Paizhang类

//具体处理者,是抽象处理者的子类,可以处理用户请求,并实现抽象处理者中定义的抽象请求处理方法
public class Paizhang extends Officer{public Paizhang(String name){super(name);}@Overridepublic void sendMission(Mission mission) {//请求满足条件if(mission.getEnemyNumber()>=10 && mission.getEnemyNumber()<50){//处理请求//10≤敌人数量<50,排长下达作战命令System.out.println("排长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为:"+mission.getEnemyNumber()+",可以下达作战指令");}else{if(this.officer!=null){this.officer.sendMission(mission);//转发请求}}}
}

Yingzhang类

//具体处理者,是抽象处理者的子类,可以处理用户请求,并实现抽象处理者中定义的抽象请求处理方法
public class Yingzhang extends Officer{public Yingzhang(String name){super(name);}@Overridepublic void sendMission(Mission mission) {//请求满足条件if(mission.getEnemyNumber()>=50 && mission.getEnemyNumber()<200){//处理请求//③50≤敌人数量<200,营长下达作战命令System.out.println("营长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为:"+mission.getEnemyNumber()+",可以下达作战指令");}else{//处理请求//敌人数量≥200,需要开会讨论再下达作战命令System.out.println("营长"+name+"接到"+mission.getSoldierName()+"的军情"+",敌人数量为"+mission.getEnemyNumber()+",敌人太多了,我们开会讨论一下吧!");}}
}

Client类

//客户端测试类
public class Client {public static void main(String[] args) {Officer bangzhang = new Banzhang("张三");Officer paizhang = new Paizhang("李四");Officer yingzhang = new Yingzhang("王五");//创建职责链bangzhang.setOfficer(paizhang);paizhang.setOfficer(yingzhang);//发送请求,请求对象通常为自定义类型Mission mission1 = new Mission("小明",7);bangzhang.sendMission(mission1);Mission mission2 = new Mission("小红",17);bangzhang.sendMission(mission2);Mission mission3 = new Mission("小强",177);bangzhang.sendMission(mission3);Mission mission4 = new Mission("小白",777);bangzhang.sendMission(mission4);} }

运行结果

设计模式之职责链模式应用例题相关推荐

  1. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

  2. python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...

  3. 【设计模式】职责链模式(C#)

    [设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...

  4. 设计模式之职责链模式(图解+例题+java源码)

    模式定义 职责链模式(Chain of Responsibility Pattern):避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到 ...

  5. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  7. 设计模式复习-职责链模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

  8. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

  9. JBPM与设计模式之职责链模式

    上篇我们了解并学习了JBPM的长事务实现,其中用到了设计模式中的职责链模式和命令模式:这块还是很有厚重感的,我们可以从中学到很多的东西:今天我们先来学习一下职责链模式. 职责链模式定义 使多个对象都有 ...

最新文章

  1. 大数据治理需要具备哪些能力和关键技术?
  2. pycharm 如何使用git链接到github实现代码提交
  3. 科大星云诗社动态20210810
  4. linux环境变量与文件查找
  5. Tomcat 的 DefaultServlet
  6. jzoj1403-渡河【SPFA】
  7. 小程序向webview传参_独家 | 支付宝小程序向个人开发者开放公测
  8. mysql format 格式化 返回值
  9. Python中的解决中文字符编码的问题
  10. leetcode-全排列详解(回溯算法)
  11. python 需要输入多个变量_使用多个变量的Python输入验证…是否简化?
  12. 机器人机构学的数学基础——绪论
  13. UWB定位系统中为何要加入陀螺仪
  14. Learning the Model Update for Siamese Trackers论文解读
  15. 火山pc实现找图找色模块
  16. div布局三栏-左中右
  17. android 补间动画停止,Android动画原理分析(一)---补间动画
  18. .NET 高级架构师0003 架构师之路(2)---架构师的职责
  19. linux使用入门debian,Debian 7.7入门安装与配置
  20. js日期格式化yyyy-MM-dd

热门文章

  1. matlab有哪些课程设计,MATLAB课程设计报告
  2. WTF...百度网盘不限速了!?
  3. DeepMind最新研究:“AI足球运动员”诞生,运球、抢断、传球、射门无所不能
  4. 01 _ 灵魂拷问:如何利用敏捷思维更好地解决实际问题?
  5. USB 无线网卡ping每隔8-10秒左右会卡一下
  6. 合并果子(fruit)
  7. volumill插件下载网盘地址_介绍几个不错的免费开源PHP相册网盘系统
  8. 竞赛入门-数据探索性分析(EDA)
  9. 抽象与接口的区别(个人理解)
  10. 【Python爬虫】模拟百度搜索并保存网页源代码