1、
适配器模式。
“适配器”,顾名思义,就是将一个类的接口转换成另外一个接口,使得原本由于接口不兼容不能一起工作的那些类一起工作。在软件开发中,系统的数据和行为都正确,但接口不符时,我们应该考虑适配器。举例来说,我们高中都学习过中文版的《论语》(里的几段著名的话),假如现在到了大学后,英语老师要我们学英文版的《论语》,以前学中文版的时候是看中文书,现在学英文版的,当然要看英文书(注意这里的英文书是实实在在
存在了的),所不变的就是继续听“子曾经曰过”什么什么了。好了,Code is cheap.让代码说话:
Code
using System;
class AdapterPattern
{
/// <summary>
/// 中文版论语
/// </summary>
class ChineseConfucianAnalects
{
//论语 最著名的一句
public virtual void ConfuciusSaid()
{
Console.WriteLine("有朋自远方来,不亦乐乎(山东腔啊)");
}
}
/// <summary>
/// 需要适配的类: 英文版论语
/// </summary>
class EnglishConfucianAnalects
{
public void EnglishConfuciusSaid()
{
Console.WriteLine("Is it not delightful to have friends coming from distant quarters?");
}
}
class Adapter : ChineseConfucianAnalects
{
private EnglishConfucianAnalects mc = new EnglishConfucianAnalects();
public override void ConfuciusSaid()
{
mc.EnglishConfuciusSaid(); //将子曰的那句著名的话"适配"成英语
}
}
/// <summary>
/// 客户端调用
/// </summary>
static void Main(string[] args)
{
ChineseConfucianAnalects cca;
Console.WriteLine("适配前普通调用");
cca = new ChineseConfucianAnalects();
cca.ConfuciusSaid();
Console.WriteLine("------------------------------------------------------------");
Console.WriteLine("利用适配器特殊调用,显示英文版的论语");
cca = new Adapter();
cca.ConfuciusSaid(); //对客户端来说,调用的看起来像是中文论语功能,实际上已经转换成为英文版论语
Console.Read();
}
} 适配器模式的使用通常都在软件开发后期或者维护阶段,因为没有哪个开发团队在开发初期愿意把类似的功能类的接口设计的不同,通常都是会先考虑通过重构统一接口。所以这个模式在开发初期应尽量避免使用。
2、
代理模式。
代理就是真实对象的代表。”代理模式“为其他对象提供一种代理以控制对这个对象的访问。代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
举例来说,我们高中都学习过中文版的《论语》(里的几段著名的话),现在到了大学后,我们求知欲望强烈^_^,很想学习英文版的《论语》,以前学中文版的时候是看中文书,现在学英文版的,当然要看英文书,可是国内没有质量过关的英文版《论语》(或者不权威,我们自己也可以翻译出来^_^)。这时候国外有汉学专家翻译了《论语》,可是版权控制的很严格,我们直接买不到,这个时候有一个出版社被授权在国内出版这本书,这样我们就可以看到原滋原味的外国人翻的《论语》了。现在就来看看英文的“子曾经曰过”什么什么了。上代码:
Code
using System;
class ProxyPattern
{
/// <summary>
/// 定义英文版论语类EnglishConfucianAnalects和代理类Proxy的共用接口,
/// 这样就可以在任何使用EnglishConfucianAnalects英文版论语类的地方都可以使用代理类Proxy
/// </summary>
abstract class ConfucianAnalects
{
public abstract void ConfuciusSaid();
}
/// <summary>
/// 英文版论语,定义代理类Proxy所代表的真实实体
/// </summary>
class EnglishConfucianAnalects:ConfucianAnalects
{
public override void ConfuciusSaid()
{
Console.WriteLine("Is it not delightful to have friends coming from distant quarters?");
}
}
/// <summary>
/// 代理类,保存一个引用使得代理可以访问实体(当前是EnglishConfucianAnalects类),
/// 并提供一个与ConfucianAnalects的接口相同的接口,这样代理类就可以代替实体类了。
/// </summary>
class Proxy : ConfucianAnalects
{
private EnglishConfucianAnalects eca;
public override void ConfuciusSaid()
{
if (eca==null)
{
eca = new EnglishConfucianAnalects();
}
eca.ConfuciusSaid();
}
}
/// <summary>
/// 客户端调用
/// </summary>
static void Main(string[] args)
{
Console.WriteLine("有朋自远方来,不亦乐乎(山东腔啊)");
Console.WriteLine("看看英语怎么说的");
Proxy proxy = new Proxy();
proxy.ConfuciusSaid(); //英文的论语
Console.Read();
}
} 上面代码中的Proxy和本例中(现实中)的出版社的用途还是有很大的区别的,这里只是举个例子,不妥之处望留意。