设计模式: 装饰者模式

 继上篇 模板方法模式  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里面重写父类的方法,再返回

......................


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值