浏览:4012008-03-19 16:38   来自迷路中的路人甲      :

最近在做个项目是用来发送短信的,前些天问了一下大家,介绍我用一下适配器模式,于是就去找来看了看。不过有一些疑惑的地方,希望大家继续帮忙呀。

首先说一下我的应用:

  1. 我自己开发了一个短信发送平台,实际的发送任务有上层的提供商来发送,我这里只是负责根据提供的接口把相关数据提供过去就可以了。
  2. 问题是,提供商不稳定,需要经常换来换取的。由于每个提供商给的接口和参数都不一样,所以我这里很不好处理。
  3. 以前的做法是每个对应的提供商,来写一套程序。好在现在只有2个提供商,所以还可以维护的过来。

下面是我的问题了:

  1. 根据大家的介绍,我了解了一下适配器的模式,针对这个模式,我自己做了一些理解
    1. 我的程序根据功能只是做出来单一的一套代码,然后针对业务调用指定接口
    2. 为每个提供商提供的接口,以及我自己写的发送接口,来编写适配器。
  2. 这样的话,我一旦有5个提供商就要编写5个适配器的代码,但是具体实现的时候只能针对一个实现。
  3. 那么更换适配器的时候,就需要在代码里面重新的修改实现部分代码,用来使用另外的适配器,不知道我的理解对不对。
  4. 不知道有没有更好的办法,可以通过配置的方式,例如通过读取数据库的值来判断使用那个适配器?

我感觉适配器模式,就是针对不同的提供商来编写了一个实现的类,然后具体实现的时候通过不同的类实例来实现不同的提供商接口。  这样理解对不对? 这样的方式,是否可以通过配置来实现更换呢?????

楼主
  1个月前   分享      :
还可以参考下策略模式。应该是可以通过配置实现的。
回复  1楼 回到顶楼 
  1个月前   伍迷      :
你的问题不仅是需要适配器,而且需要用比如“反射”技术加简单工厂模式来解决实例化哪个对象的问题。

建议阅读我写的《小菜编程成长记》,特别是讲反射那一节,或许你能找到答案。
http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html
回复  2楼 回到顶楼 
  1个月前   金色海洋(jyk)      :
那不是和我的那个文章一样了吗?
http://www.cnblogs.com/jyk/archive/2008/01/15/1040413.html

其实对于你的这个问题,我有一个“馊主意”:
需要先确认一个前提:不管有多少个供应商,在同一个项目里面,一段时间内(一天、一个月、一年)只使用一个供应商。

如果符合前提请往下看,
1、把处理程序放在一个单独的项目里面,就是说可以编译成独立的dll文件。
在这里定义一个类,类里面有一个函数,比如叫做
SendMsg(string no ,string msg )

2、这个项目只需要处理一个提供商的接口。

3、然后在你的项目里面引用这个dll。
然后就是调用函数发送短信了。

(这些好像没有什么吧,“馊主意”在下面)

4、记得第一个项目吗,第一个项目只能处理一个供应商的接口,再有一个怎么办呢?再加一个“相同”的项目,处理第二个供应商的接口,同理有几个供应商就建立一个项目。

5、为什么要建立这么多的项目呢,为的就是可以编译出来多个dll,一个供应商对应一个dll文件。

6、注意我使用了“相同” 二字,相同指的是什么呢?就是相同的命名空间,相同的类名,相同的函数以及相同的参数。

7、好了,如果换了供应商的话换一个dll就可以了。

回复  3楼 回到顶楼 
  1个月前   迷路中的路人甲      :
@金色海洋(jyk)
你的这个“馊主意”,我也想到了。不过想到一个商业软件用这么“业余”的办法来觉得问题有点说不过去了。 不过还是多谢你了。

@伍迷
多谢你,我先看看。本来是做网站的。现在开始弄客户端程序,感觉好多东西都需要学习。

现在最大的问题是,简单的应用可以写,高级一点的两眼一抹黑,学都不知道怎么学。
回复  4楼 回到顶楼 
  1个月前   金色海洋(jyk)      :
其实也没有什么的,看看 System.Data 命名空间下面的连接各种数据库的,
连接SQL Server的叫做 SqlCommand, 连接...呵呵。

其实我觉得可以这么做,客户买的产品搭配哪种短信平台,那就赠送哪种短新平台的dll库,也未尝不可。能找到一种冠冕堂皇的理由就可以了。

没有什么业余不业余的说法,不知道你有没有看过某财务软件的数据库,那可不是一般的乱呀。

你见过用Access 2000 写的软件吗?能卖很多钱的。用vb6.0写的同样也可以买很多钱的。所以业余的说法是不成立的。
回复  5楼 回到顶楼 
  1个月前   迷路中的路人甲      :

看了反射以及一些其他的资料。现在项目改成这样了。
1.创建了一个ISMS的接口。 声明了所有的短信操作。
2.实际的短信操作类,继承这个ISMS接口,来实现对不同的提供商的短信处理。分别是smsProvider1 和smsProvider2
3.利用xml文件保存类名称。 使用的时候通过下拉菜单选择使用那个类来进行处理
4.利用反射机制根据选择的类名称,来创建实例,进行实际操作。

到现在为止,基本保证了业务短信的唯一性,实际的数据发送只是和接口发生关系,最终的处理由相关类来进行。这样当出现新的提供商的时候,只要根据接口为这个提供商写一个处理的类文件就行了,然后再xml中增加一个类的名称。

在一定程度上简化了修改工作。
做到这里我又发现一个问题,是否可以将这些个提供商的类编译成为DLL。然后根据反射机制进行动态加载呢?
我查了一些资料,发现是可以这么做的?但是之前的接口部分要如何修改呢?因为之前声明的时候是从接口声明的,现在如果写成DLL,是不是就不能使用接口了?

@金色海洋(jyk)
关键是领导总想要最好的解决办法,这种“业余”的办法只能是没办法中的办法了。
回复  6楼 回到顶楼 
  1个月前   李中华      :




http://www.cnblogs.com/kenne/archive/2008/01/23/1050097.html

这里面有一个实例应该可以解决你的问题。
回复  7楼 回到顶楼 
  1个月前   没有昵称      :
提供商才多少个,你就简简单单的用Adapter就好了,
难道你会三天两头的换提供商?

从你的需求来看,你的主要目标应该是“当提供商变动的时候不需要修改我程序的代码”。而不是“当提供商变动的时候不需要做任何事情”,除非你要求你的提供商按照你指定的规则去写接口,无论你用反射还是用啥。

模式是用来“避免因为小改动而产生大改动”的。
回复  8楼 回到顶楼 
  1个月前   没有昵称      :
一个简单的HelloWorld程序,就可以用上Factory、Command、Observer、Templete Method等等。
不过你会这样去写HelloWorld程序么?
没必要过多的为未来买单。
回复  9楼 回到顶楼 
  3周前   笨→鸟(Bird)      :
@迷路中的路人甲
如果这样做你倒不如在项目中引入IOC框架来解耦
回复  10楼 回到顶楼 

你还不是小组成员,加入小组以后才能发布新主题!
> 返回“设计模式”


其他话题

1 19187