软件设计模式行为式模式

软件设计模式作业三行为式模式

软件设计模式行为式模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

简介

设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。

随着软件开发社群对设计模式的兴趣日益增长,已经出版了一些相关的专著,定期召开相应的研讨会,而且Ward Cunningham为此发明了WikiWiki用来交流设计模式的经验。

模式列表

设计模式分为三大类:创建型、结构型、行为型。创建型模式处理的是对象的创建过程(通过各种方式创建对象,使对象创建和管理变得简单),结构型模式处理的是对象/类的组合,行为型模式处理类和对象间的交互方式和任务分布。(只有类可以创建对象,接口只能被实现)

行为型设计模式

##行为式设计模式

  1. 职责链模式
  2. 组合命令模式
  3. 中介者模式
  4. 备忘录模式
  5. 观察者模式
  6. 状态模式
  • 计划任务
  • 完成任务

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hha12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值