使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。[已经增加了实现的代码]
2008-01-15 21:24 金色海洋(jyk) 阅读(4034) 评论(40) 编辑 收藏 举报
最近项目里遇到了一个问题,为了解决这个问题“动用了”继承、多态还有工厂模式和反射,但是还是没有OO的感觉。呵呵。
先说一下具体情况:
1、使用短信猫来接收短信。简单的说,短信猫收到短信后会往指定的表里面填写数据。
2、接收到短信,然后根据短信前面的“标志”调用不同的方式来处理。
3、发送确认信息或者是错误提示。
4、想做成一个“通用”的模块,不管是什么项目,都可以使用这个程序来处理接收短信的问题。当然具体的处理方式要能很方便的修改或者扩充。
我的实现方式:
1、定义一个基类,用来处理接收到的短信。
2、由于每一种短信的处理方式都不同,所以需要好多的不同的子类。每一个子类来处理一种短信。
3、调用的时候 如果用 case 的方式的话,每增加一总短信都要修改case 。很烦!而且当应用在一个项目里的时候,case 就得推倒重来,烦!
最后使用了反射。
4、建立了三个项目,一个是winform的用来检查表里面是否有新的短信,叫做A ;一个是处理短信的项目,叫做B;最后一个就是具体的项目了。
==============
说明:
具体的项目指的是,可能是A公司的OA,可能是B公司的CRM,也可能是C公司的ERP。
这里说的是分“项目”,而不是分层。
处理短信的项目要根据不同的公司的不同的需求来编写,写完了之后编译成DLL,交由 A 来调用。
==============
5、其中 A 是通用的,写好了基本不变。B编译成dll,好让A来调用。
6、A 调用处理短信的类。由于使用了反射,可以“动态”的指定dll名称和类名。这样就很灵活了,处理短消息的方式有变化的话,只需要更新dll就可以了。
换成新的项目的时候,换成新的dll就可以了。这样A就不用改了。
现在基本功能是实现了,但是这样就OO了吗?还是没有OO感觉。
感觉还是在用面向过程的思路来写程序,一个子类里面只有一个函数,和面成过程有什么区别呢?
您可能要问了,那我为什么还要用多态呢?其实很简单,这样就可以使用“反射”了,这样我就不用写case了,可以让A不必随不同的项目而修改了。
说白了就是想当变化的时候少改点代码。
正在看面向对象、设计模式了什么的,把自己的想法、做法写出来,请大家批批。
ps:这里好象用“观察者”更好一点,A就是一个发布者,B是一个订阅者,只是我不知道如何让B来订阅A。
也许根本就不适合吧,毕竟有新的短信了,只有一种处理方法是对应的,其他的都不是。
代码补充:
namespace HBS.SMSReceive
{
/// <summary>
/// 接收短信。基类
/// </summary>
public class MessageReceive
{
public DataAccessLayer dal ;
处理短信的函数

把短信移动到历史记录里面
}

子类1:处理没有标志的短信

子类2:MessageOperation01 第一种短信的回执
}
然后就是A里面的调用的代码
//获取短信内容,放在 DataTable dt 里面
//然后遍历 dt
处理接收到的短信
大体就是这样了。
反射还是在看了伍迷的小菜系列才会用的,再此表示感谢。
先说一下具体情况:
1、使用短信猫来接收短信。简单的说,短信猫收到短信后会往指定的表里面填写数据。
2、接收到短信,然后根据短信前面的“标志”调用不同的方式来处理。
3、发送确认信息或者是错误提示。
4、想做成一个“通用”的模块,不管是什么项目,都可以使用这个程序来处理接收短信的问题。当然具体的处理方式要能很方便的修改或者扩充。
我的实现方式:
1、定义一个基类,用来处理接收到的短信。
2、由于每一种短信的处理方式都不同,所以需要好多的不同的子类。每一个子类来处理一种短信。
3、调用的时候 如果用 case 的方式的话,每增加一总短信都要修改case 。很烦!而且当应用在一个项目里的时候,case 就得推倒重来,烦!
最后使用了反射。
4、建立了三个项目,一个是winform的用来检查表里面是否有新的短信,叫做A ;一个是处理短信的项目,叫做B;最后一个就是具体的项目了。
==============
说明:
具体的项目指的是,可能是A公司的OA,可能是B公司的CRM,也可能是C公司的ERP。
这里说的是分“项目”,而不是分层。
处理短信的项目要根据不同的公司的不同的需求来编写,写完了之后编译成DLL,交由 A 来调用。
==============
5、其中 A 是通用的,写好了基本不变。B编译成dll,好让A来调用。
6、A 调用处理短信的类。由于使用了反射,可以“动态”的指定dll名称和类名。这样就很灵活了,处理短消息的方式有变化的话,只需要更新dll就可以了。
换成新的项目的时候,换成新的dll就可以了。这样A就不用改了。
现在基本功能是实现了,但是这样就OO了吗?还是没有OO感觉。
感觉还是在用面向过程的思路来写程序,一个子类里面只有一个函数,和面成过程有什么区别呢?
您可能要问了,那我为什么还要用多态呢?其实很简单,这样就可以使用“反射”了,这样我就不用写case了,可以让A不必随不同的项目而修改了。
说白了就是想当变化的时候少改点代码。
正在看面向对象、设计模式了什么的,把自己的想法、做法写出来,请大家批批。
ps:这里好象用“观察者”更好一点,A就是一个发布者,B是一个订阅者,只是我不知道如何让B来订阅A。
也许根本就不适合吧,毕竟有新的短信了,只有一种处理方法是对应的,其他的都不是。
代码补充:


















然后就是A里面的调用的代码
//获取短信内容,放在 DataTable dt 里面
//然后遍历 dt
Assembly.Load("SMS").CreateInstance("SMS.短信" + 短信开头的编号)

大体就是这样了。
反射还是在看了伍迷的小菜系列才会用的,再此表示感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!