1 0

系统设计问题5

1.场景描述:

  我们有信息处理子系统,包含的抽象类如下:
  Message[抽象类,string info;void handle();]
  Log[抽象类,string serviceName;string methodName;]
  日志模块,包含的类如下:
  SysLog[系统日志,Exception exp;void handle(){Log.append(info,exp);}]
  Business[业务日志]
  站内短消息模块,包含的类如下:
  WeChat[短消息,string title,User sender;List<User> receivers;]
  邮箱模块,发送邮件,类描述略..

2.问题描述:

  写日志的话,new SysLog().handle();
  短消息的话,new WeChat().handle();
  邮件的话,new Mail().handle();
 
如果有一个需求,把某条消息Message,既写日志又发邮件还发站内短消息。岂不是得分别生成这三个对象,再分别调用handle()方法?

  有没有一种好的设计,能够实现在代码中只需类似
new Message().logHandle().WeChatHandle().MailHandle();


问题补充:可能是代码太简陋的,有些奇异,补充一下:

之所以现在需要构造每一种(SysLog、WeChat、Mail)对象,然后分别处理,是因为三者的构造函数所需要的参数是不同的。

例如:
SysLog可能封装Exception等;
WeChat可能需要封装Sender信息等;
Mail可能需要封装Sender、Receiver等信息。
否则的话,用大家的处理方式都是行的通的。

也就是说,消息(Message)的生成者(业务代码)需要对不同的消息处理者(SysLog、WeChat、Mail)进行一定的干预。
按照目前的情况,生产一条消息(Message),需要分别包装成SysLog、WeChat、Mail,然后调用各自的handle();方法进行处理。

因此,我们现在寻求一种把消息(Message)和消息处理SysLog、WeChat、Mail进行解耦的合理方案。
2013年8月16日 09:58

8个答案 按时间排序 按投票排序

0 0

采纳的答案

你的描述看的不是太清晰,说下自己做过类似的案例:
一个监控的应用,主要监控集群实例状态、主机运行情况等等,预先设置阀值,如果低于阀值,就执行相应的告警处理,如:实例的内存、队列低于阀值,就执行日志处理,如实例挂掉,就执行日志处理、短信通知……

其实就是对获取到的监控数据分析之后,通过监听器进行处理。如:
定义接口Listener,方法doHandle()

定义几种实现类(LogListener、MessageListener、MailListener……)

对于你说的消息,可以在获取消息的类中添加实例变量listeners集合,把几种listener实现类注入到这个集合里面,那么对于消息的后续处理可通过:
for(Listener listener: listeners) {
   listener.doHandle(message);
}
这样可以做到实际处理类与消息的低耦合,如果后面又增加一种监听器,这里的代码不用改,只需要注入新的监听器即可。

2013年8月16日 11:11
0 0

那就参考spring security的拦截器案例来实现,每个拦截器先检查是否是自己需要的类,如果不是,跳过,如果是,自己处理。也就是在Listener接口与实现类之间再抽象出一层,增加一个抽象方法isSupport(Object object),并且实现doHandle方法,如下:
public abstract class AbstractListener implements Listener {
    public void doHandle(Object object) {
        if(isSupport(object)) {
             handle(object)
        }
    }
    protected abstract void handle(Object o);
    protected abstract boolean isSupport(Object o);
}

具体实现类:
public class SysLog extends AbstractListener {
    protected void handle(Object o) {
        业务逻辑处理
     }
    protected boolean isSupport(Object o) {
        if(o == null) return false;
        if(o instanceof Exception) {
              return true;
         }
     }
}

这样就做到处理的对象和处理类之间的解耦,每个处理类只处理自己支持的类型。不知道是否能满足你的设计需求

2013年8月16日 23:27
0 0

  
你是需要根据Logger级别来做不同的处理的一个帮助类吧?

出现Exception可能需要三个都掉用, 出现warn的时候可能只需要Wechat?

写个静态类实现下不就成了? 那种return this的思路不对, 万一哪天需要修改下策略, 所有调用的地方都得修改...

Log.AppException(******); -- 三个都调用, 下次exception策略修改的时候 只需要修改这里。

Log.Warn(); --这里可能只需要调用两个

不要为了缩短一行代码掉坑里了.

2013年8月16日 15:19
0 0

什么模式也不用 简单的包装一下就行了

class Message{
     SysLog sysLog = new SysLog();
     WeChat chat = new WeChat();
     Mail mail = new Mail();

    public Log logHandle(){  
       sysLog.handle();
       return this;
    }

    public Log WeChatHandle(){
      chat.handle();
      return this;
    }

    public Log MailHandle(){
      mail.handle();
      return this;
    }

}


调用
new Message().logHandle().WeChatHandle().MailHandle(); 


当然Message可以做成单例
Message.getInst().logHandle().WeChatHandle().MailHandle(); 

2013年8月16日 14:30
0 0

这个地方适当的使用装饰器模式可能比较适合:
(1)Message:
public abstract class Message {
abstract void handle(String info);
}
(2)Mail:
public class Mail extends Message{
private Message message;
public Mail(){
}
public Mail(Message message){
this.message = message;
}
void handle(String info) {
System.out.println("mail:"+info);//Mail的handle逻辑,此处简化为打印
if(message != null){
message.handle(info);
}
}
}
(3)SysLog:
public class SysLog extends Message{
private Message message;
public SysLog(){
}
public SysLog(Message message){
this.message = message;
}
void handle(String info) {
System.out.println("syslog:"+info);//SysLog的handle逻辑,此处简化为打印
if(message != null){
message.handle(info);
}
}
}
(4)main:
new Mail(new SysLog()).handle("ok");//注:可以以任意组合和顺序来装饰

不知道是否满足你的场景?如果需要receivers信息,就修改相应的构造函数

2013年8月16日 13:27
0 0

设计模式的组合模式。

建个CompositeHandler类,它本身实现handle,在类里面有个实现handle的类的列表。
然后,

1. 按需求组合构建CompositeHandler。add需要的实例进去,比如Message,WeChat等。
2. 调用CompositeHandler的handle方法,该方法中循环上述的list,分别调用它们的handle方法。

即可。

2013年8月16日 11:03
0 0

写日志、发短消息、发邮件等其实都是做同一类事情,也就是对事件进行记录或是通知,提供一个专门的【事件处理服务】,使用者只需要调用这个【事件处理服务】就行了,而这个【事件处理服务】内部会进行写日志、发短消息、发邮件或是几种的组合操作。也即是说把业务层和写日志发消息发邮件的这个层进行的分离,降低了耦合,也减少了重复代码,业务层只需要认识这个【事件处理服务】就行了,也就封装了变化。

另外,这根本不是系统设计,只是代码实现层次的设计。

2013年8月16日 10:54
0 0

1. 如果觉得每次new不优雅,那就将这三个类做成单例,只要业务允许
2. 如果要做成链式的,在Message里定义你这三个方法 *Handle(),返回值为Message。

2013年8月16日 10:47

相关推荐

    电子系统设计与实战STM32 FPGA控制版

    - 常见电子系统设计问题的诊断与解决。 - 如何使用硬件描述语言(HDL)如VHDL或Verilog来设计FPGA逻辑。 - STM32在物联网(IoT)、机器人技术、自动化和数据采集等领域的应用。 - 系统设计的调试和测试技巧。 - 高级...

    教学系统设计何克抗--网络版..pdf

    教学系统设计是以解决教学问题、优化学习为目的的特殊的设讣活动,既具有设讣学科的 一般性质,又必须遵循教学的基本规律。 二、教学系统设计的特征 教学系统设计有以下特征: * 应用系统方法研究、探索教与学...

    控制系统设计指南(第3版)

    ### 控制系统设计指南(第3版)知识点总结 #### 一、控制系统的概述与基本概念 本书《控制系统设计指南》(第3版)是一本深入浅出地讲解自动控制系统设计的专业书籍。它从工程实践的角度出发,全面覆盖了控制系统...

    液压系统设计及常见问题

    液压系统设计及常见问题

    系统架构设计师教程(第2版)-希赛版.pdf

    全书内容覆盖了系统架构设计相关的广泛知识点,旨在帮助考生深入理解系统架构设计的理论基础、设计方法和实际应用,提升其解决复杂系统设计问题的能力。 书中对系统架构设计师的角色和职责有详细的说明。架构师负责...

    信息系统设计与分析真题+笔记.pdf

    结构化系统设计的步骤包括问题定义、需求分析、系统设计、系统实施、系统维护等。结构化系统设计的方法包括数据流图、数据字典、系统流程图等。 用例建模是信息系统设计与分析的重要步骤,包括用例建模的定义、用例...

    存储系统设计(HUST).zip

    《存储系统设计(HUST)》是...通过《存储系统设计(HUST)》这门课程的学习,学生不仅能掌握存储系统的基本原理,还能具备解决实际问题的能力,为未来在计算机硬件设计、系统优化、云计算等领域的工作打下坚实基础。

    光学系统设计原书第四版 光盘

    《光学系统设计原书第四版》是光学领域的一本经典著作,由知名专家Milton Laikin撰写。这本书深入探讨了光学系统设计的基础理论和实际应用,为光学工程师和科研人员提供了宝贵的参考资料。光盘包含的资源丰富,可能...

    现代直流伺服控制技术及其系统设计

    PWM直流伺服电动机控制系统设计涵盖了从系统设计概述、执行电动机的选择、传动装置的确定、伺服检测装置的确定、校正网络和调节器补偿形式的选取到PWM驱动装置的设计等多个方面。在设计过程中,需要根据伺服系统的...

    Linux文件加密系统设计.pdf

    该系统设计的目的是解决 Linux 上的文件加密问题,确保文件的安全性和完整性。该系统设计使用文件锁和消息 Hook 机制来加密和解密文件,从而解决用户透明性问题。 二、 文件加密系统设计的挑战 传统的第三方加密...

    《光机系统设计》第四版 卷1&2 Opto-Mechanical Systems Design, Fourth Edition, Volume1&2

    《光机系统设计》第四版是Paul Yoder, Jr.和Daniel Vukobratovich两位...通过详细地阐述光学和机械设计的原则,并结合案例分析、问题解决技巧以及最新的技术趋势,这本书旨在成为光机系统设计领域不可或缺的参考资料。

    伺服系统设计指导.pdf

    伺服系统设计不仅仅是一个技术问题,更是一个工程问题,它需要设计者对整个系统的工作原理有深入的理解,并能够将理论知识应用到实际的设计和调试中去。因此,一个合格的伺服系统设计师需要具备电机学、控制理论、...

    通用两维运动平台设计解读.pdf

    该设计主要解决了X-Y工作台的机械系统设计问题,包括传动系统、导轨系统和电气原理图的设计。其中,螺旋传动系统是该设计的核心组成部分,需要对螺旋传动的刚度、稳定性、寿命等参数进行验算。 控制系统设计 控制...

    转向系统设计规范

    转向系统设计规范是汽车设计中的一个重要部分,主要涉及汽车转向系统的设计原则、技术要求和性能标准。以下是对提供的文件内容进行的知识点梳理和扩展。 一、转向系统概述 1. 转向系统功能 转向系统是汽车的重要...

    分布式系统设计(PDF)

    提出了分布式系统的各种问题,如互斥问题、死锁的预防和检测、处理机间的通信机制、可靠性问题、负载分配问题、数据管理问题及其可能的解决方案,并讨论了分布式系统设计在操作系统、文件系统、共享存储器系统、...

    基于RFID公交车刷卡系统设计.doc

    该基于 RFID 公交车刷卡系统设计旨在解决城市交通拥堵问题,提高交通网的通行能力和交通环境的质量。该系统具有先进的信息技术、数据通讯传输技术、电子传感技术和计算机处理技术的集成,能够实时、准确、高效地管理...

    数据密集型应用系统设计高清版.zip

    《数据密集型应用系统设计》是一本深入探讨大数据处理与分析技术的专业书籍,高清版的PDF格式使得读者能够更清晰地阅读和理解其中的内容。这本书主要面向IT专业人员,特别是那些在数据科学、大数据处理、分布式系统...

    光学系统设计第4版 镜头库

    《光学系统设计第4版 镜头库》是一份重要的教育资源,主要针对光学工程、物理、光电技术等领域的专业人士和学生。这份资料包含了光学系统设计的最新理论和实践知识,特别是利用ZEMAX软件进行光学设计的重要工具——...

Global site tag (gtag.js) - Google Analytics