-
系统设计问题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个答案 按时间排序 按投票排序
-
采纳的答案
你的描述看的不是太清晰,说下自己做过类似的案例:
一个监控的应用,主要监控集群实例状态、主机运行情况等等,预先设置阀值,如果低于阀值,就执行相应的告警处理,如:实例的内存、队列低于阀值,就执行日志处理,如实例挂掉,就执行日志处理、短信通知……
其实就是对获取到的监控数据分析之后,通过监听器进行处理。如:
定义接口Listener,方法doHandle()
定义几种实现类(LogListener、MessageListener、MailListener……)
对于你说的消息,可以在获取消息的类中添加实例变量listeners集合,把几种listener实现类注入到这个集合里面,那么对于消息的后续处理可通过:
for(Listener listener: listeners) {
listener.doHandle(message);
}
这样可以做到实际处理类与消息的低耦合,如果后面又增加一种监听器,这里的代码不用改,只需要注入新的监听器即可。2013年8月16日 11:11
-
那就参考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
-
你是需要根据Logger级别来做不同的处理的一个帮助类吧?
出现Exception可能需要三个都掉用, 出现warn的时候可能只需要Wechat?
写个静态类实现下不就成了? 那种return this的思路不对, 万一哪天需要修改下策略, 所有调用的地方都得修改...
Log.AppException(******); -- 三个都调用, 下次exception策略修改的时候 只需要修改这里。
Log.Warn(); --这里可能只需要调用两个
不要为了缩短一行代码掉坑里了.2013年8月16日 15:19
-
什么模式也不用 简单的包装一下就行了
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
-
这个地方适当的使用装饰器模式可能比较适合:
(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
-
设计模式的组合模式。
建个CompositeHandler类,它本身实现handle,在类里面有个实现handle的类的列表。
然后,
1. 按需求组合构建CompositeHandler。add需要的实例进去,比如Message,WeChat等。
2. 调用CompositeHandler的handle方法,该方法中循环上述的list,分别调用它们的handle方法。
即可。2013年8月16日 11:03
-
写日志、发短消息、发邮件等其实都是做同一类事情,也就是对事件进行记录或是通知,提供一个专门的【事件处理服务】,使用者只需要调用这个【事件处理服务】就行了,而这个【事件处理服务】内部会进行写日志、发短消息、发邮件或是几种的组合操作。也即是说把业务层和写日志发消息发邮件的这个层进行的分离,降低了耦合,也减少了重复代码,业务层只需要认识这个【事件处理服务】就行了,也就封装了变化。
另外,这根本不是系统设计,只是代码实现层次的设计。2013年8月16日 10:54
-
1. 如果觉得每次new不优雅,那就将这三个类做成单例,只要业务允许
2. 如果要做成链式的,在Message里定义你这三个方法 *Handle(),返回值为Message。2013年8月16日 10:47
相关推荐
防排烟系统设计问题讨论.ppt
短网址系统则是另一个常见的系统设计问题,需要考虑到URL的短化、重定向和缓存等问题。信息流和定时任务调度器也是系统设计中常见的问题,需要考虑到数据的实时性和处理能力。 API限速和线程安全的HashMap是系统...
- 常见电子系统设计问题的诊断与解决。 - 如何使用硬件描述语言(HDL)如VHDL或Verilog来设计FPGA逻辑。 - STM32在物联网(IoT)、机器人技术、自动化和数据采集等领域的应用。 - 系统设计的调试和测试技巧。 - 高级...
这份资料包含了一系列关于机械系统设计的期末试题以及相应的解答,旨在帮助学生深入理解和掌握课程中的核心概念,提高分析和解决问题的能力。 机械系统设计是机械工程的重要组成部分,它涉及到机械设备的设计、分析...
如何准备和回答系统设计问题 客观的 学习和实施大规模分布式系统并不容易。 我不想给人一种可以在一个月内学到的东西的印象。 该存储库旨在实现的目标是,让软件工程师和学生大致了解设计大规模设计的思想过程是如何...
该设计的目的是通过机械部分设计、数控系统设计和控制系统设计来解决数控车床的加工范围和精度问题。同时,该设计还旨在培养学生的设计能力、分析问题和解决问题的能力、应用手册、标准和编写技术说明书的能力。 ...
### 控制系统设计指南(第3版)知识点总结 #### 一、控制系统的概述与基本概念 本书《控制系统设计指南》(第3版)是一本深入浅出地讲解自动控制系统设计的专业书籍。它从工程实践的角度出发,全面覆盖了控制系统...
全书内容覆盖了系统架构设计相关的广泛知识点,旨在帮助考生深入理解系统架构设计的理论基础、设计方法和实际应用,提升其解决复杂系统设计问题的能力。 书中对系统架构设计师的角色和职责有详细的说明。架构师负责...
电子系统设计是一门涵盖广泛的学科,它涉及到电路设计、信号处理、计算机硬件、通信技术和控制理论等多个领域。在这个PDF文档中,我们很可能会找到关于这些主题的深入探讨和实例分析。电子系统设计不仅关注硬件层面...
结构化系统设计的步骤包括问题定义、需求分析、系统设计、系统实施、系统维护等。结构化系统设计的方法包括数据流图、数据字典、系统流程图等。 用例建模是信息系统设计与分析的重要步骤,包括用例建模的定义、用例...
伺服系统设计不仅仅是一个技术问题,更是一个工程问题,它需要设计者对整个系统的工作原理有深入的理解,并能够将理论知识应用到实际的设计和调试中去。因此,一个合格的伺服系统设计师需要具备电机学、控制理论、...
《存储系统设计(HUST)》是...通过《存储系统设计(HUST)》这门课程的学习,学生不仅能掌握存储系统的基本原理,还能具备解决实际问题的能力,为未来在计算机硬件设计、系统优化、云计算等领域的工作打下坚实基础。
PWM直流伺服电动机控制系统设计涵盖了从系统设计概述、执行电动机的选择、传动装置的确定、伺服检测装置的确定、校正网络和调节器补偿形式的选取到PWM驱动装置的设计等多个方面。在设计过程中,需要根据伺服系统的...
《光学系统设计原书第四版》是光学领域的一本经典著作,由知名专家Milton Laikin撰写。这本书深入探讨了光学系统设计的基础理论和实际应用,为光学工程师和科研人员提供了宝贵的参考资料。光盘包含的资源丰富,可能...
《光机系统设计》第四版是Paul Yoder, Jr.和Daniel Vukobratovich两位...通过详细地阐述光学和机械设计的原则,并结合案例分析、问题解决技巧以及最新的技术趋势,这本书旨在成为光机系统设计领域不可或缺的参考资料。
嵌入式系统设计师是IT行业中一个重要的角色,主要负责设计和开发用于特定设备或应用的嵌入式系统。这个资料包针对的是准备参加软考中级的“嵌入式系统设计师”考试的考生,包含了丰富的学习资源,旨在帮助考生全面...
4. **电磁兼容性(EMC)**:高速数字系统设计必须考虑到电磁辐射和干扰问题,以确保设备能在电磁环境中正常工作且不对其它设备产生影响。学习EMC规范和测试方法是至关重要的。 5. **差分信号与高速接口**:像LVDS...
北邮 邹华 分布式计算环境第七章——分布式系统设计的几个问题
Linux二级文件系统设计 【开发语言及实现平台或实验环境】 C++/VC++ 【设计要求】 理解Linux的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;...
该基于 RFID 公交车刷卡系统设计旨在解决城市交通拥堵问题,提高交通网的通行能力和交通环境的质量。该系统具有先进的信息技术、数据通讯传输技术、电子传感技术和计算机处理技术的集成,能够实时、准确、高效地管理...