设计模式之组合模式与观察者模式应用例题
Posted shangzh!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之组合模式与观察者模式应用例题相关的知识,希望对你有一定的参考价值。
设计模式之组合模式与观察者模式应用例题
题目描述
某会议管理系统的“会议通知发送”模块说明如下:
(1)行政管理人员可以给某个或某些员工(Employee)发送会议通知,也可以给某个部门(Department)发送通知,如果给某个部门发送通知,将逐个给该部门每个员工发送会议通知。
(2)如果员工或部门希望能够收到会议通知,必须先注册到一个会议列表(MeetingList)中,在发送通知时,系统将遍历会议列表,逐个将会议通知发送给注册用户(User)。
根据以上说明,使用组合模式与观察者模式设计该“会议通知发送”模块,请给出设计模式的定义,并绘制类结构图、类图说明及编写相应代码。
类结构图及相关说明
User类:抽象类,子构件Employee类和容器构件Department类,User类抽象类定义了访问及管理它的子构件的方法,包含增加子构件add()、删除子构件remove()、获取子构件getChild()以及业务方法operation(),作为抽象构件它可以是接口或者抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包括所有子类共有的行为的声明和实现。
MeetingLsit类:目标类,又称为主题,MeetingList类是指被观察的对象。在MeetingList类定义了一个观察者集合,一个观察者目标可以接受任意数量的观察者来观察,MeetingList类提供了方法来增加观察者对象addUser()和删除观察者对象removeUser(),同时MeetingList类定义了通知方法sendNotify(),来通知观察者。
Department类:声明部门类属于一个具体观察者,内置集合存放所有员工实例,实现了在抽象类User类中的定义的方法,包含添加员工方法add()、移除员工方法remove()、获取员工方法getChild()和具体实现业务方法operation(),在其业务方法中可以递归调用其子结点Employee类的业务方法operation()。
Employee类:声明员工类属于一个具体观察者,具体实现属于自己的operation方法,实现在抽象类User类中定义的方法,对于那些访问及管理子构件的方法,可以通过抛出异常、提示错误等方式进行处理。
程序代码
User类
public abstract class User
public abstract void add(User user); //增加成员
public abstract void remove(User user); //删除成员
public abstract User getChild(int i); //获取成员
public abstract void operation(); //业务方法
MeetingList类
import java.util.ArrayList;
public class MeetingList
//定义一个观察者集合用于存储所有观察者对象
protected ArrayList <User>meetingList = new ArrayList<User>();
//注册方法,用于向观察者集合中增加一个观察者
public void addUser(User user)
meetingList.add(user);
//注销方法,用于从观察者集合中删除一个观察者
public void removeUser(User user)
meetingList.remove(user);
//通知方法
public void sendNotify()
//遍历观察者集合,调用每个观察者的响应方法
for (Object mt:meetingList)
System.out.println("会议通知已经发送给所有注册员工!!!");
((User)mt).operation();
Employee类
public class Employee extends User
@Override
public void add(User user)
//异常处理或错误显示
@Override
public void remove(User user)
//异常处理或错误显示
@Override
public User getChild(int i)
//异常处理或错误显示
return null;
@Override
public void operation()
//具体业务方法的实现
System.out.println("员工已收到通知!!!");
Department类
import java.util.ArrayList;
public class Department extends User
//声明一个集合用来将员工存放在部门下
private ArrayList<User> list = new ArrayList<User>();
//重写添加员工方法
@Override
public void add(User user)
list.add(user);
//重写删除员工方法
@Override
public void remove(User user)
list.remove(user);
//重写获取员工方法
@Override
public User getChild(int i)
return (User)list.get(i);
@Override
public void operation()
System.out.println("部门已收到开会通知,通知所属部门所有员工!!!");
//具体业务方法的实现,将递归调用成员构成的业务方法
for (Object object:list)
((User)object).operation();
Client类
//客户端测试类
public class Client
public static void main(String[] args)
//创建两个具体观察者对象
User employee1 = new Employee();
Department department1 = new Department();
//创建具体目标对象
MeetingList mt =new MeetingList();
//部门进行通知
System.out.println("---------------部门通知-----------------");
department1.add(employee1);
department1.operation();
System.out.println("---------------------------------------");
//员工通知
System.out.println("---------------员工通知-----------------");
mt.addUser(employee1); //添加观察者对象
mt.sendNotify(); //调用目标对象方法
System.out.println("---------------------------------------");
运行结果
以上是关于设计模式之组合模式与观察者模式应用例题的主要内容,如果未能解决你的问题,请参考以下文章