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

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

题目描述

某会议管理系统的“会议通知发送”模块说明如下:
(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("---------------------------------------");
    }
}

运行结果

在这里插入图片描述

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
包含3个实验,状态—观察者模式(某网上书店,用户购买图书可以积分,积分达到一定值后可以升级为银会员、黄金会员等(用户等级有普通会员、银会员、黄金会员、钻石会员等),不同级别的会员购买图书有不同的优惠。同时用户也可以用积分在网上书店兑换小礼品购书券),组合观察者模式(某会议管理系统的“会议通知发送”模块说明如下: (1)行政管理人员可以给某个或某些员工(Employee)发送会议通知,比如周六要通知员工A和员工B加班,该系统就会向员工A和B发通知,如果周日某个部门要整体加班,该系统会给某个部门(Department)发送通知,部门里面的每个员工都会收到加班通知。 (2)如果员工或者部门希望能够收到会议通知,必须先注册到一个会议列表(MeetingList)中,在发送通知时,系统将逐个将会议通知发送给注册用户(User)),建造者—工厂方法—状态模式(联机游戏中每一个游戏人物角色都需要提供一个完整的角色造型,包括人物造型(body)、服装(costume)、武器(weapon)等,武器主要有AK47冲锋枪、狙击枪和手枪,不同的武器外观、使用方法和杀伤力不同,玩家可以使用不同的武器,而且随着游戏的升级,还可以增加新的武器,无需对现有系统做太多修改。同时游戏角色存在3中不同的状态,如正常状态、暂停状态、阵亡状态等,在不同的状态下角色的行为不同(暂停、开始游戏、射击、移动、被攻击),并且能够在不同状态下转换。使用三种模式完成该游戏角色的设计。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

稚皓君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值