系统设计问题

问题描述

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进行解耦的合理方案。

解决方案

你的描述看的不是太清晰,说下自己做过类似的案例:一个监控的应用,主要监控集群实例状态、主机运行情况等等,预先设置阀值,如果低于阀值,就执行相应的告警处理,如:实例的内存、队列低于阀值,就执行日志处理,如实例挂掉,就执行日志处理、短信通知……其实就是对获取到的监控数据分析之后,通过监听器进行处理。如:定义接口Listener,方法doHandle()定义几种实现类(LogListener、MessageListener、MailListener……)对于你说的消息,可以在获取消息的类中添加实例变量listeners集合,把几种listener实现类注入到这个集合里面,那么对于消息的后续处理可通过:for(Listener listener: listeners) { listener.doHandle(message);}这样可以做到实际处理类与消息的低耦合,如果后面又增加一种监听器,这里的代码不用改,只需要注入新的监听器即可。
解决方案二:
那就参考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; } }}这样就做到处理的对象和处理类之间的解耦,每个处理类只处理自己支持的类型。不知道是否能满足你的设计需求
解决方案三:
你是需要根据Logger级别来做不同的处理的一个帮助类吧?出现Exception可能需要三个都掉用, 出现warn的时候可能只需要Wechat?写个静态类实现下不就成了? 那种return this的思路不对, 万一哪天需要修改下策略, 所有调用的地方都得修改...Log.AppException(******); -- 三个都调用, 下次exception策略修改的时候 只需要修改这里。Log.Warn(); --这里可能只需要调用两个不要为了缩短一行代码掉坑里了.
解决方案四:
什么模式也不用 简单的包装一下就行了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();
解决方案五:
这个地方适当的使用装饰器模式可能比较适合:(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信息,就修改相应的构造函数
解决方案六:
设计模式的组合模式。建个CompositeHandler类,它本身实现handle,在类里面有个实现handle的类的列表。然后,1. 按需求组合构建CompositeHandler。add需要的实例进去,比如Message,WeChat等。2. 调用CompositeHandler的handle方法,该方法中循环上述的list,分别调用它们的handle方法。即可。
解决方案七:
写日志、发短消息、发邮件等其实都是做同一类事情,也就是对事件进行记录或是通知,提供一个专门的【事件处理服务】,使用者只需要调用这个【事件处理服务】就行了,而这个【事件处理服务】内部会进行写日志、发短消息、发邮件或是几种的组合操作。也即是说把业务层和写日志发消息发邮件的这个层进行的分离,降低了耦合,也减少了重复代码,业务层只需要认识这个【事件处理服务】就行了,也就封装了变化。另外,这根本不是系统设计,只是代码实现层次的设计。
解决方案八:
1. 如果觉得每次new不优雅,那就将这三个类做成单例,只要业务允许2. 如果要做成链式的,在Message里定义你这三个方法 *Handle(),返回值为Message。

时间: 2024-07-30 12:27:05

系统设计问题的相关文章

方法-基于散列表的电话号码查询系统设计

问题描述 基于散列表的电话号码查询系统设计 基于散列表的电话号码查询系统设计 基本要求: 1) 设每个记录有下列数据项:电话号码.用户名.地址: 2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表: 3) 采用一定的方法解决冲突: 4) 查找并显示给定电话号码的记录: 5) 查找并显示给定用户名的记录. 扩展要求: 1) 系统功能的完善: 2) 设计不同的散列函数,比较冲突率: 3) 在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察 平均查找长度的变化. 解决方案 参考

Delphi+Word的数据库系统设计

Delphi擅长做数据库系统的开发,其功能强大,开发快速.但现在大多数的数据库系统80%的工作都是简单的增删改的工作,用数据库系统来实现增删改,存在录入不方便,录入内容简单等问题,尤其对于处理大量的文本和图片的数据库系统来说更是非常不便.报表输出还需要利用Delphi中各个版本提供的报表工具或第三方打印控件进行开发.虽然Delphi中提供的报表工具功能逐渐强大,使用愈加方便,但是如果想充分利用该报表工具开发强大实用的报表,仍得花费一定的精力去学习该报表组件的各个功能.例如Delphi6中提供的Q

移动交互设计案例:客户端APP的通知系统设计

文章描述:本文只梳理设计原则,后续相关内容会持续更新. 这里的通知包括但不限于公告.提醒或消息(不同使用场景下的功能定义不同). 关于各客户端平台(ios.android.wp等)的通知机制,在其交互设计指南中有更详细的说明,大家可自行参考. 写在前面: 通知系统是网站信息传播机制的重要的一部分,足够写一大章来说明.本文只梳理设计原则,后续相关内容会持续更新. 这里的通知包括但不限于公告.提醒或消息(不同使用场景下的功能定义不同). 关于各客户端平台(ios.android.wp等)的通知机制,

ASP.net文章管理系统:系统设计与编码(上)

asp.net|编码|设计 经过前面系统分析和数据库设计,文章管理系统的基本设计环境已经建立起来了,按照管理信息系统设计的环节,现在已经进入了系统实施阶段.本系统拟采用Visual Studio.NET2003设计.使用Visual Studio.NET2003新建一个Web应用程序 ,命名为TheArticleSYS,具体步骤略.下面,我们按照数据信息积累分先后顺序详细介绍本系统的设计与编写.首先是后台管理部分,然后是前台浏览和检索部分.     14.3.1 Admin_Management

ASP.net文章管理系统:系统设计与编码(下)

asp.net|编码|设计 ASP.net文章管理系统:系统设计与编码. 相关文章:ASP.net文章管理系统:系统设计与编码(上)     14.3.4 ArticlesList.aspx的设计与编码     ArticlesList.aspx提供了两个功能:     (1)根据传入参数列出该类别的文章列表:     (2)根据传入参赛检索出符合条件的文章列表.     这两个功能的实现是有后台逻辑程序根据传入的参数类型判断,然后为用户提供不同的服务.     ArticlesList.asp

可缓存的CMS(网站内容管理器)系统设计

缓存|设计 对于一个日访问量达到百万级的网站来说,速度很快就成为一个瓶颈.除了优化内容发布系统的应用本身外,如果能把不需要实时更新的动态页面的输出结果转化成静态网页来发布,速度上的提升效果将是显著的,因为一个动态页面的速度往往会比静态页面慢2-10倍,而静态网页的内容如果能被缓存在内存里,访问速度甚至会比原有动态网页有2-3个数量级的提高.动态缓存和静态缓存的比较 基于反向代理加速的站点规划 基于apache mod_proxy的反向代理加速实现 基于squid的反向代理加速实现 面向缓存的页面

PS教程:使用960栅格系统设计网站界面

本教程我们将学习如何使用960栅格系统设计网站界面.该栅格系统会优化网站设计流程.最终效果预览 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]  下一页

基于反向代理的Web缓存加速——可缓存的CMS系统设计

web|缓存|设计 对于一个日访问量达到百万级的网站来说,速度很快就成为一个瓶颈.除了优化内容发布系统的应用本身外,如果能把不需要实时更新的动态页面的输出结果转化成静态网页来发布,速度上的提升效果将是显著的,因为一个动态页面的速度往往会比静态页面慢2-10倍,而静态网页的内容如果能被缓存在内存里,访问速度甚至会比原有动态网页有2-3个数量级的提高. 动态缓存和静态缓存的比较 基于反向代理加速的站点规划 基于apache mod_proxy的反向代理加速实现 基于squid的反向代理加速实现 面向

数据库系统设计全面介绍

数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求). 在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统. 一.数据库和信息系统 (1)数据库是信息系统的核心和基础,把信息系统中大量的数据按一定的模型组织起来,提供存储.维护.检索数据的功能,使信息系统可以方便.及时.准确地从数据库中获得所需的信息. (2)数据库是信息系统的各个部分能否紧密地结合在一

分布式系统设计权衡:CAP

写在最前: 1.为什么学习并记录分布式设计理念一系列相关的东西 在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是很多人理解的可用性,一致性等等问题,都是自己拍脑袋想的,或者根本和最原始表达的意思就不是一个东西,在这种情况下PK,就像不再一个频段的人在交流,除了争论,没有任何实质性的进展,所以有必要熟悉其理论基础,以免贻笑大方.(其实类似的例子还有很多,国内的技术人员都喜欢把一些此词模糊化,混淆而谈.例如XX云