休息了两天。。俺又回来了。。忽然发现 设计模式小组(http://space.cnblogs.com/group/mode/)被升为 特色推荐小组,朕甚是欣慰啊。。o(∩_∩)o... 吼吼。。闲话不多说了。。进入今天的正题。。
啥子叫适配器模式啊。。
比如说那个电源的插头吧,他们都是有规格的。。你三项插头插不到两项的被。。那你三项的非要插到两项的。。怎么办啊。。那就用个中转的东东来作为中间件吧。。套上三项的,接出来个两项的,就能插到那个两项的插座了被。。
看看定义。。吼吼。。
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。就好像标题说的那样 一只看起来像鸭子的火鸡。。但是俺还不想举这个例子,为啥子尼。。毕竟是搞web.net开发,所以
俺想例子还是以网络开发的例子为主还是比较容易引起咱们web开发人员的兴趣的。。
一个夜黑风高的夜晚。。故事就这样开始了。。
“头儿,听说博客园要征召新闻发布系统的开发程序,公开招标啊。。”小菜说。。“是啊,那咱把咱自己的新闻发布给他们发过去一套就KO了,看看能夺标不。。没夺上也不可惜。。嘎嘎”老板心中暗笑。。还有这样的好事。。
“不好拉,刚发现博客园的招标截至时间马上就到了,还有3个小时就结束了,而且人家用的统一的接口,和咱们的接口完全不一样啊,从新开发时间肯定不够,而且临时开发出来的东西肯定也比不上人家多年开发的结果了”小菜心灰意冷的说。。
“难道你没听说过设计模式里有一个设计模式,叫适配器模式吗。。去做一个中转的接口,一端是博客园的新闻接口,一边是咱们新闻的接口,中间一插不就KO了吗。。估计有一个来小时就搞定了。。还不快去。。我还等着中标呢。。”老板焦急的说。。
“啊。。我怎么把它给忘了呢。。还是老板有仙剑知名啊。。我对老板的佩服犹如滔滔江水连绵....”小菜说着,只感觉到有人背后一脚。。“还不赶紧去给我干活。。又来这套。。”“哦。。收到。。头儿..”
三天后。。
“头。。咱中标拉。。还是您的方法好,30多家网络公司,有两家中标啦。。其中就有咱。。看来实力才是最有竞争的最佳手段啊!!”小菜很是兴奋。。
“那博客园承诺的笔记本什么时候拿来啊。。”“当时那个奖品是偏你的啦。。o(∩_∩)o...哈哈”小菜说完一溜烟的就跑了。。
------------------------------------------
看来俺还是有写故事的本事的。。嘎嘎。。
下面为公司的竞标代码:o(∩_∩)o...
//博客园招标大赛的对外接口
public interface cnblogsNews {
string displayNews(string classId);
string displayUserInfo(string UserId);
string siteInfo();
}
//彭彭公司网站新闻发布的接口
public interface ppNews {
string ppNews(string class_id);
string ppUserInfo(string user_id);
string ppInfo(string siteName);
}
//彭彭公司的类
public class News : ppNews
{
#region ppNews 成员
public string ppNews(string class_id)
{
// TODO: 添加 News.ppNews 实现
return "栏目classId为:"+class_id+"<br>";
}
public string ppUserInfo(string user_id)
{
// TODO: 添加 News.ppUserInfo 实现
return "用户信息的Id为:"+user_id+"<br>";
}
public string ppInfo(string siteName)
{
// TODO: 添加 News.ppInfo 实现
return "网站信息:"+siteName+"<br>";
}
#endregion
}
//小菜为公司招标所写的新闻发布适配器
public class ppNewsAdapter : cnblogsNews
{
News news;
public ppNewsAdapter(News news)
{
//
// TODO: 在此处添加构造函数逻辑
//
this.news = news;
}
#region cnblogsNews 成员
public string displayNews(string classId)
{
// TODO: 添加 ppNewsAdapter.displayNews 实现
return news.ppNews(classId);
}
public string displayUserInfo(string UserId)
{
// TODO: 添加 ppNewsAdapter.displayUserInfo 实现
return news.ppUserInfo(UserId);
}
public string siteInfo()
{
// TODO: 添加 ppNewsAdapter.siteInfo 实现
return news.ppInfo("zzcn.net");
}
#endregion
}
------------------------------------
页面调用代码:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
News news = new News();//创建了自己公司的新闻对象
cnblogsNews cnbn = new ppNewsAdapter(news);
testCnblogsNews(cnbn);
}
public void testCnblogsNews(cnblogsNews cnbn)
{
this.Page.Response.Write(cnbn.displayNews("32"));
this.Page.Response.Write(cnbn.displayUserInfo("58"));
this.Page.Response.Write(cnbn.siteInfo());
}
------------------------------------
网页输出内容:(Vs2003 下编译成功)
栏目classId为:32
用户信息的Id为:58
网站信息:zzcn.net
------------------------------------
今天又写了一个模式的小故事。。吼吼。。感觉写的多了的时候,发现,很多时候,接口太重要了。。几乎没个模式都有
接口存在。。所以基本功还是非常非常重要的哦。。嘎嘎。。