继上篇 模板方法模式 http://blog.csdn.net/lyq5655779/article/details/7176789
假如我们要给存进去的值进行加密,取出来的时候进行解密这样的一个功能,我们应该怎么办呢,重写BaseSettingProvider父类,如果还有功能要加呢,这样扩展性不是很好吧。
装饰者模式就这样出现了。不修改原来的抽象类,而是到要装饰的对象 传入到装饰者里面。
public class DesSettingProvider:ISettingprovider//实现接口
{
private ISettingprovider provider;
public DesSettingProvider(ISettingprovider provider)//这一步非常重要,构造函数(把要装饰的对象,传给装饰者)
{
this.provider = provider;
}
#region ISettingprovider 成员
public string this[string name]
{
get
{
string s = provider[name];
return DES.DESDecrypt(s);//解密操作
}
set
{
string s=DES.DESEncrypt(value);//加密操作
provider[name]=s;
}
}
public string[] Name
{
get { return provider.Name; }
}
public bool ExistName(string name)
{
return provider.ExistName(name);
}
#endregion
}
上面就是装饰者对对象的操作。
调用的时候,我们应该怎么处理呢。
string provider = ConfigurationManager.ConnectionStrings["connstr"].ProviderName;
ISettingprovider sp = null;
if (provider == "sql")
{
sp = new SqlSettingProvider();
}
else if (provider == "Access")
{
}
else
{
throw new Exception("没有这个数据类型");
}
sp = new DesSettingProvider(sp);//把sp传递给装饰者处理,只要加这一步就OK了,其它操作一样的
Console.WriteLine(sp.ExistName("用户名"));
sp["李成功"] = "为什么呢";
string v1 = sp["李成功"];
Console.WriteLine(v1);
foreach(string name in sp.Name)
{
Console.WriteLine(name);
}
Console.ReadKey();
看上面的执行过程吧,只说一下string v1=sp['李成功'];得到值的操作
1.new SqlSettingProvider();
2.把sp传入到DesSettingProvider
3.调用索引器的get
4.provider[name]调用BaseSettingProvider的get
5.遇到 protected abstract IDbConnection CreateConnection();就去调用 SqlSettingProvider里面重写父类的方法,再返回
......................