[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章 中介者模式部分代码作答,如有缺漏欢迎指正~