告诉你什么是优雅的设计(2)--------重构EasyMonitor
程序员文章站
2022-05-17 20:12:05
...
EasyMonitor1.0出来后不久,玩着玩着,我就敏锐地发现"被第一颗子弹击中",设计还有问题。根据先贤的一些经验告诉我们,被击中后就应该马上重构。于是,马不停蹄,着手1.5版本的改造。为什么1.0就直奔1.5呢,因为这次重构之后的结构已经与原来的设计有了比较大的变化,也扩展了一些功能。
可能你已经迫不及待想知道第一颗子弹是什么?研究了EasyMonitor1.0设计的同学,不知道有没有发现,action所做的扩展无法被processor复用,反之亦然。具体地说,就是监视动作无法成为处理动作。例如,你想在处理动作中也去进行url监控,则不得不在processor中重新实现一次。
如何解决这个问题呢?伟大的java设计者已经给了我们设计的灵感,将世间万物抽象为一个Object,任何东西都从之继承。
于是一个优雅的设计方案浮出水面,我们将所有的行为都抽象成一个Action。下面是1.5的类图,不妨与1.0作个对比:
以下是一个案例的配置文件:
程序打包下载。
通过这次重构告诉大家三件事:
1.第一颗子弹原则很给力
2.学会模式而后忘记模式
3.没有完美的设计,只有更优雅的设计
可能你已经迫不及待想知道第一颗子弹是什么?研究了EasyMonitor1.0设计的同学,不知道有没有发现,action所做的扩展无法被processor复用,反之亦然。具体地说,就是监视动作无法成为处理动作。例如,你想在处理动作中也去进行url监控,则不得不在processor中重新实现一次。
如何解决这个问题呢?伟大的java设计者已经给了我们设计的灵感,将世间万物抽象为一个Object,任何东西都从之继承。
于是一个优雅的设计方案浮出水面,我们将所有的行为都抽象成一个Action。下面是1.5的类图,不妨与1.0作个对比:
以下是一个案例的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <TaskManager> <!-- 周期性任务 --> <ScheduleTask id="2" name="98服务器监视"> <!-- 时间间隔,单位是秒 --> <interval>30</interval> <!-- URL监视动作 --> <Monitor> <url>http://192.168.1.98:8080</url> </Monitor> <!-- 监控结果处理器 --> <Processor> <!-- 监视成功处理队列 <OnSuccess> <RunProgram> <path>cmd /c start notepad</path> </RunProgram> </OnSuccess> --> <!-- 监视失败处理队列 --> <OnFailure> <RunProgram> <path>E:\cluster\tomcat7\bin\startup.bat</path> </RunProgram> <!-- 发送邮件 --> <SendMail> <receivers>holdmydream@126.com,javaeye2010@126.com</receivers> <subject>警告</subject> <content>你的程序已经杯具。不必太伤心,神马都是浮云。</content> </SendMail> </OnFailure> </Processor> </ScheduleTask> <!-- 定时任务 --> <OnTimeTask id="1" name="100服务器监视"> <!-- yyyy-MM-dd hh:mm:ss --> <time>2011-01-20 15:49:30</time> <Monitor> <url>http://192.168.1.100:8080</url> </Monitor> <Processor> <OnSuccess> <RunProgram> <path>cmd /c start notepad</path> </RunProgram> </OnSuccess> <OnFailure> <RunProgram> <path>cmd /c start msconfig</path> </RunProgram> </OnFailure> </Processor> </OnTimeTask> </TaskManager>
程序打包下载。
通过这次重构告诉大家三件事:
1.第一颗子弹原则很给力
2.学会模式而后忘记模式
3.没有完美的设计,只有更优雅的设计