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


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

    题目描述

    某会议管理系统的“会议通知发送”模块说明如下:
    (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();        //业务方法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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("员工已收到通知!!!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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("---------------------------------------");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果

    在这里插入图片描述

  • 相关阅读:
    ES6 Class和Class继承
    Java -- SpringSession实现session共享
    Android学习笔记 15. ConstraintLayout 约束布局
    Redis分片集群实验
    Java线上云酒馆单预约系统源码小程序源码
    leetCode 139.单词拆分 + 完全背包 + 排列数
    java基于ssm的汽车维修保养管理系统
    【kubernetes】关于k8s集群中的ingress规则案例
    MySQL视图详解
    react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)
  • 原文地址:https://blog.csdn.net/m0_46669450/article/details/125547125