设计模式之组合模式与观察者模式应用例题

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("---------------------------------------");
    

运行结果

以上是关于设计模式之组合模式与观察者模式应用例题的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之观察者模式与访问者模式详解和应用

设计模式之享元模式与组合模式详解和应用

设计模式之桥接模式应用例题

设计模式之代理模式应用例题

设计模式之桥接模式应用例题

设计模式之工厂方法模式应用例题