软件设计模式作业三行为式模式
软件设计模式行为式模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简介
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
随着软件开发社群对设计模式的兴趣日益增长,已经出版了一些相关的专著,定期召开相应的研讨会,而且Ward Cunningham为此发明了WikiWiki用来交流设计模式的经验。
模式列表
设计模式分为三大类:创建型、结构型、行为型。创建型模式处理的是对象的创建过程(通过各种方式创建对象,使对象创建和管理变得简单),结构型模式处理的是对象/类的组合,行为型模式处理类和对象间的交互方式和任务分布。(只有类可以创建对象,接口只能被实现)
行为型设计模式
##行为式设计模式
- 职责链模式
- 组合命令模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 计划任务
- 完成任务
1、题目1-职责链模式
1.1 作业题目
在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军情(如敌人的数量),作战命令需要上级批准,如果直接上级不具备下达命令的权力,则上级又传给上级,直到有人可以决定为止。现使用职责链模式来模拟该过程,客户类(Client)模拟情报人员,首先向级别最低的班长(Banzhang)递交任务书(Mission),即军情,如果超出班长的权力范围,则传递给排长(Paizhang),排长如果也不能处理则传递给营长(Yingzhang),如果营长也不能处理则需要开会讨论。我们设置这几级长官的权力范围分别是:
① 敌人数量<10,班长下达作战命令。
② 10<敌人数量<50,排长下达作战命令。
③ 50<敌人数量<200,营长下达作战命令。
④ 敌人数量>200,需要开会讨论再下达作战命令。
绘制类图并编程实现。
1.2 所用模式结构视图
1.3 本实例类图
1.4 实例实现代码
详细下载源代码
职责链模式
package HH31职责链模式;
public class HH31Banzhang extends HH31Officer {
public HH31Banzhang(String name) {
super(name);
}
public void handleMission(HH31Mission mission) {
if (mission.getEnemyNum()<10) {
System.out.println("班长"+name+"处理军情"+mission.getEnemyNum()+"人");
}
else
{
if (this.successor != null) {
this.successor.handleMission(mission);
}
}
}
}
package HH31职责链模式;
public class HH31Meeting extends HH31Officer{
public HH31Meeting(String name) {
super(name);
}
public void handleMission(HH31Mission mission) {
if(mission.getEnemyNum()<50) {
System.out.println("开会"+name+"处理军情"+mission.getEnemyNum()+"人");
}
else {
System.out.println("敌人太多了,请求支援!");
}
}
}
package HH31职责链模式;
public class HH31Mission {
private int enemyNum; //敌人的数量
public HH31Mission(int enemyNum) {
this.enemyNum = enemyNum;
}
public int getEnemyNum() {
return enemyNum;
}
public void setEnemyNum(int enemyNum) {
this.enemyNum = enemyNum;
}
}
package HH31职责链模式;
public abstract class HH31Officer {
protected String name; //处理人身份
protected HH31Officer successor;
public HH31Officer(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HH31Officer getSuccessor() {
return successor;
}
public void setSuccessor(HH31Officer successor) {
this.successor = successor;
}
public abstract void handleMission(HH31Mission mission);
}
package HH31职责链模式;
public class HH31Paizhang extends HH31Officer {
public HH31Paizhang(String name) {
super(name);
}
public void handleMission(HH31Mission mission) {
if (mission.getEnemyNum()<50)
{
System.out.println("排长"+name+"处理军情"+mission.getEnemyNum()+"人");
}
else
{
if (this.successor != null) {
this.successor.handleMission(mission);
}
}
}
}
package HH31职责链模式;
public class HH31Yingzhang extends HH31Officer {
public HH31Yingzhang(String name) {
super(name);
}
public void handleMission(HH31Mission mission) {
if (mission.getEnemyNum()<200) {
System.out.println("营长"+name+"处理军情"+mission.getEnemyNum()+"人");
}
else {
if(this.successor != null) {
this.successor.handleMission(mission);
}
}
}
}
下载链接
源代码下载链接:
https://download.csdn.net/download/hha12138/13763468
作业文档下载链接:
https://download.csdn.net/download/hha12138/13764086
2、题目2-组合命令模式
2.1 作业题目
2.使用组合命令模式实现多功能开关,让用户进行设置,可以同时控制教室的所有灯的开和关,并能控制风扇、空凋、多媒体投影仪设备的开和关。
2.2 所用模式结构视图
2.3 本实例类图
2.4 实例实现代码
package HH31command;
public class HH31airCleaner extends HH31Device{
public void close() {
System.out.println("空调关了");
}
public void open() {
System.out.println("空调开了");
}
}
```java
```java
package HH31command;
public class HH31Blower extends HH31Device {
public void close() {
System.out.println("风扇关了");
}
public void open() {
System.out.println("风扇开了");
}
}
package HH31command;
public abstract class HH31Command {
protected HH31Device device;
public abstract void execute();
}
package HH31command;
public class HH31Controller {
private HH31Command lightsOpenCommand, lightsCloseCommand, blowerOpenCommand,
blowerCloseCommand, airOpenCommand,airCloseCommand, multiOpenCommand, multiCloseCommand;
public HH31Controller(HH31Command lightsOpenCommand, HH31Command lightsCloseCommand,HH31Command blowerOpenCommand,
HH31Command blowerCloseCommand,HH31Command airOpenCommand,HH31Command airCloseCommand,
HH31Command multiOpenCommand,HH31Command multiCloseCommand) {
this.lightsOpenCommand = lightsOpenCommand;
this.lightsCloseCommand = lightsCloseCommand;
this.blowerOpenCommand = blowerOpenCommand;
this.blowerCloseCommand = blowerCloseCommand;
this.airCloseCommand = airCloseCommand;
this.airOpenCommand = airOpenCommand;
this.multiCloseCommand = multiCloseCommand;
this.multiOpenCommand = multiOpenCommand;
}
public void openAllLights() {
lightsOpenCommand.execute();
}
public void closeAllLights() {
lightsCloseCommand.execute();
}
public void openBlower() {
blowerOpenCommand.execute();
}
public void closeBlower() {
blowerCloseCommand.execute();
}
public void openAirCleaner() {
airOpenCommand.execute();
}
public void closeAirCleaner() {
airCloseCommand.execute();
}
public void openMulti() {
multiOpenCommand.execute();
}
public void closeMulti() {
multiCloseCommand.execute();
}
}
package HH31command;
public abstract class HH31Device {
public abstract void close();
public abstract void open();
}
package HH31command;
public class HH31DeviceCloseCommand extends HH31Command {
public HH31DeviceCloseCommand(HH31Device device) {
this.device = device;
}
public void execute() {
device.close();
}
}
package HH31command;
public class HH31DeviceOpenCommand extends HH31Command{
public HH31DeviceOpenCommand(HH31Device device) {
this.device = device;
}
public void execute() {
device.close();
}
}
package HH31command;
import java.util.ArrayList;
public class HH31DevicePackage extends HH31Device{
private ArrayList<HH31Device> list = new ArrayList<HH31Device>();
public void addDevice(HH31Device device) {
list.add(device);
}
public void removeDevice(HH31Device device) {
list.remove(device);
}
public void close() {
int index = 1;
for (HH31Device device : list) {
System.out.println(index +"号");
device.close();
index++;
}
}
public void open() {
int index = 1;
for(HH31Device device : list) {
System.out.println(index +"号");
device.open();
index++;
}
}
}
package HH31command;
public class HH31Light extends HH31Device{
public void close() {
System.out.println("灯关了");
}
public void open() {
System.out.println("灯开了");
}
}
package HH31command;
public class HH31Multimedia extends HH31Device{
public void close() {
System.out.println("多媒体关了");
}
public void open() {
System.out.println("多媒体开了");
}
}
下载链接
源代码下载链接:
https://download.csdn.net/download/hha12138/13763468
作业文档下载链接:
https://download.csdn.net/download/hha12138/13764086
3、题目3-中介者模式
3.1 作业题目
使用中介者模式来说明联合国的作用,要求绘制相应的类图并分析每个类的作用(注:可以将联合国定义为抽象中介者类,联合国下属机构如WIO,WHO,WTO等作为具体者类,国家作为抽象同事类,而将中国,美国等国家作为具体同事类).
3.2 所用模式结构视图
3.3 本实例类图
3.4 实例实现代码
package HH31中介者模式;
public class HH31America extends HH31Country{
public HH31America() {
this.name = new String ("America");
}
public void SendMessageByWTO(String cou,String msg) {
wto.SendMassage(this.name, cou, msg);
}
}
package HH31中介者模式;
public class HH31China extends HH31Country {
public HH31China() {
this.name = new String ("China");
}
public void SendMessageByWTO(String cou,String msg) {
wto.SendMassage(this.name, cou, msg);
}
}
package HH31中介者模式;
public class HH31Client {
public static void main(String[] args) {
HH31UN [] un = new HH31UN[3];
un[0] = new HH31WTO();
un[1] = new HH31WHO();
un[2] = new HH31WFC();
HH31Country [] cou = new HH31Country[3];
cou[0] = new HH31China();
cou[1] = new HH31Japan();
cou[2] = new HH31America();
for (int i = 0;i<un.length;i++)
for(int j = 0;j<cou.length;j++)
un[i].AddCountry(cou[j]);
for(int i = 0;i<cou.length;i++) {
cou[i].setWfc(un[2]);
cou[i].setWho(un[1]);
cou[i].setWto(un[0]);
}
cou[0].SendMessageByWTO("America", "中方反对美国干涉中方内政");
cou[1].SendMessageByWHO("China", "WHO");
cou[2].SendMessageByWFC("China", "WFC");
}
}
package HH31中介者模式;
public abstract class HH31Country {
protected String name;
protected HH31UN wto,who,wfc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HH31UN getWto() {
return wto;
}
public void setWto(HH31UN wto) {
this.wto = wto;
}
public HH31UN getWho() {
return who;
}
public void setWho(HH31UN who) {
this.who = who;
}
public HH31UN getWfc() {
return wfc;
}
public void setWfc(HH31UN wfc) {
this.wfc = wfc;
}
public abstract void SendMessageByWTO(String cou,String msg);
public void SendMessageByWHO(String cou,String msg) {
who.SendMassage(this.name, cou, msg);
}
public void SendMessageByWFC(String cou,String msg) {
wfc.SendMassage(this.name, cou, msg);
}
public void ReceiveMessage(String cou,String msg) {
System.out.println(name+"收到来自"+cou+"的消息:"+msg);
}
public boolean equals(Object co) {
HH31Country c = (HH31Country) co;
if (co == null ||this.name == null ||c.getName() == null)
return false;
return name.equals(c.getName());
}
}
package HH31中介者模式;
public class HH31Japan extends HH31Country {
public HH31Japan() {
this.name = new String ("Japan");
}
public void SendMessageByWTO(String cou,String msg) {
wto.SendMassage(this.name, cou, msg);
}
}
package HH31中介者模式;
import java.util.Hashtable;
public abstract class HH31UN {
protected String name;
protected Hashtable<String,HH31Country>country;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HH31UN() {
this.country = new Hashtable<String,HH31Country>();
}
public void AddCountry(HH31Country co) {
if (country == null)
return;
country.put(co.getName(),co);
}
protected void DelCountry(HH31Country co) {
if (country == null)
return;
country.remove(co.getName());
}
public void SendMassage(String from,String to,String msg) {
HH31Country co = country.get(to);
if (co != null)
co.ReceiveMessage(from,msg);
else
System.out.println("对不起!"+from+"不存在,可能还未加入UN!");
}
public void ReceiveMessage(String from,String to,String msg) {
ReceiveMessage(from,to,msg);
}
}
package HH31中介者模式;
public class HH31WFC extends HH31UN {
public HH31WFC() {
super();
this.name = new String("WFC");
}
}
package HH31中介者模式;
public class HH31WHO extends HH31UN {
public HH31WHO() {
super();
this.name = new String("WHO");
}
}
package HH31中介者模式;
public class HH31WTO extends HH31UN{
public HH31WTO() {
super();
this.name = new String("WTO");
}
}
下载链接
源代码下载链接:
https://download.csdn.net/download/hha12138/13763468
作业文档下载链接:
https://download.csdn.net/download/hha12138/13764086