[Java]观察者模式和中介者模式改造机场

[Java]观察者模式和中介者模式改造机场

题目

请以下面的情景为基础,将以下的情景进行
优化:
1、 定义4个处理者类型,分别是地勤groundService(地勤),carrier(搬运),Driver(司机),Customs(海关)
2、 整个工作的流程是:飞机落地land(),观察者接受到间谍类传递的信息,EventDispatch(中介者)类将事件进行分发,处理类型分别是地勤去接货+land(1);搬运进行装车+getOn(2);司机去运输+run(3);海关进行检查+inspect(4)。
要求:
1、 使用观察者模式和中介模式进行混合改造,建立观察者类和中介类
2、 画出改造后的UML图,并写出代码。

代码部分

Java语言

import java.util.ArrayList;
import java.util.List;

//抽象的被观察者
interface Observable
{
	//添加观察者
	public void addWatcher(Observer ob);
	//移除观察者
	public void removeWatcher(Observer ob);
	//被观察的动作
	public void action();
}

//抽象的观察者
interface Observer
{
	//观察到动作后做出的反应
	public void updateAction(String planeNumble);
	//输出观察者信息
	public String toString();
}

//抽象的中介类
abstract class EventDispatchity
{
	protected GroundService groundService;
	protected Carrier carrier;
	protected Driver driver;
	protected Customs customs;
	
	public void setWatcher(GroundService groundService,
	Carrier carrier,Driver driver,Customs customs)
	{
		this.groundService = groundService;
		this.carrier = carrier;
		this.driver = driver;
		this.customs = customs;
	}
}

//具体中介类
class EventDispatch extends EventDispatchity implements Observer
{
	//中介类实现观察者接口中的方法,从而实现代替地勤、司机、海关等类
	public EventDispatch(GroundService groundService,
	Carrier carrier,Driver driver,Customs customs)
	{
		super.setWatcher(groundService, carrier, driver, customs);
	}
	
	public EventDispatch() {}

	@Override
	public void updateAction(String planeNumble) {
		super.groundService.land(planeNumble);
		super.carrier.getOn(planeNumble);
		super.driver.run(planeNumble);
		super.customs.inspect(planeNumble);
	}
	public String toString()
	{
		return super.groundService.toString() + super.carrier.toString()
			+super.driver.toString() + super.customs.toString();
	}
}

//观察者之一,地勤
class GroundService
{
	//地勤的名字
	private String groundSeviver;
	public GroundService() {}
	public GroundService(String name) {groundSeviver = name;}
	//地勤去接货
	public void land(String planeName)
	{
		System.out.println(planeName + " 飞机已落地," + "地勤:" 
		+ groundSeviver + " " + "去接货");
	}
	
	@Override
	public String toString() {
		return "地勤的名字是: " + groundSeviver;
	}
}

//观察者之一,搬运
class Carrier
{
	//搬运的名字
	private String carrierName;
	public Carrier() {}
	public Carrier(String name) {carrierName = name;}
	//搬运进行装车
	public void getOn(String planeNumble)
	{
		System.out.println(planeNumble+ " 飞机已落地," + "搬运:" 
		+ carrierName + " " + "进行装车");
	}

	@Override
	public String toString() {
		return "搬运的名字是:" + carrierName;	
	}
	
}

//观察者之一,司机
class Driver
{
	//司机的名字
	private String driverName;
	public Driver() {}
	public Driver(String name) {driverName = name;}
	//司机去运输
	public void run(String planeNumble)
	{
		System.out.println(planeNumble + " 飞机已落地," + "司机:" 
		+ driverName + " " + "去运输");
	}

	@Override
	public String toString() {
		return "司机的名字是:" + driverName;
		
	}
}

//观察者之一,海关
class Customs
{
	//海关的名字
	private String customsName;
	public Customs() {}
	public Customs(String name) {customsName = name;}
	//海关进行检查
	public void inspect(String planeNumble)
	{
		System.out.println(planeNumble + " 飞机已落地," + "海关:" 
		+ customsName + " " + "进行检查");
	}
	
	@Override
	public String toString() {
		return "海关的名字是: " + customsName;
	}
}

class Plane implements Observable
{
	//飞机名字
	private String planeNumble;
	public Plane() {}
	public Plane(String numble) {planeNumble = numble;}
	
	//动态数组中存储观察者
	private List<Observer> list = new ArrayList<Observer>();

	//增加观察者
	@Override
	public void addWatcher(Observer ob) {
		list.add(ob);
	}

	//移除观察者
	@Override
	public void removeWatcher(Observer ob) {
		list.remove(ob);
	}
	
	//飞机落地
	public void land()
	{
		System.out.println(planeNumble  + "飞机落地");
		this.action();
	}
	
	//飞机动作观察响应(落地动作时)
	@Override
	public void action() {
		for(Observer ob:list)
		{
			System.out.println("*************************************");
			ob.updateAction(planeNumble);
			System.out.println("*************************************");
		}
	}
}

public class FinalTest {
	public static void main(String args[]) {
		GroundService groundService = new GroundService("张地勤");
		Carrier carrier = new Carrier("张搬运");
		Driver driver = new Driver("张司机");
		Customs customs = new Customs("张海关");
		Plane plane = new Plane("C1008");
		
		/* new 一个观察者 这里EventDispatch虽然是中介者,但是我还是想给它起名Watcher
		 * 这样就可以Watcher watcher = new Watcher(其实确实可以,只不过题目有要求),
		 * 本质是Watcher 只不过这个中介者集成了 地勤、搬运、司机、海关四个角色,
		 * 因为地勤、搬运、司机、海关四个角色本质上就是Watcher,使用中介者能很好的,
		 * 各司其职。可以发现我在前面new四个角色对象时直接new了他们的类,
		 * 而不是使用Observer groundService = new GroundService("..."),
		 * 这个就是中介者的好处*/
		EventDispatch watcher = new EventDispatch();
		watcher.setWatcher(groundService, carrier, driver, customs);
		
		//给飞机安好观察者
		plane.addWatcher(watcher);
		plane.land;
	}
}

运行结果

运行结果

补充

本题来源->广东财经大学电子商务系统分析与设计2018-2019第二学期期末考试最后一题
此代码仅作参考学习~
借鉴《设计模式之禅(第2版)》中 第14章 中介者模式 、第22章 中介者模式部分代码作答,如有缺漏欢迎指正~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值