微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设计模式 - Provider Pattern(提供者模式)

设计模式 - Provider Pattern(提供者模式)


作者: webabcd


介绍
一个API进行定义和实现的分离。


示例
一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在sqlServer数据库中或Xml文件里。根据配置文件中的配置来决定数据持久化方案是使用sqlServer数据库还是Xml文件



MessageModel

using  System;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// Message实体类

    
/// </summary>

    public class MessageModel

    
{

        
/// <summary>

        
/// 构造函数

        
/// </summary>

        
/// <param name="msg">Message内容</param>

        
/// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)

        
{

            
this._message = msg;

            
this._publishTime = pt;

        }


        
private string _message;

        
/// <summary>

        
/// Message内容

        
/// </summary>

        public string Message

        
{

            
get return _message; }

            
set { _message = value; }

        }


        
private DateTime _publishTime;

        
/// <summary>

        
/// Message发布时间

        
/// </summary>

        public DateTime PublishTime

        
{

            
get return _publishTime; }

            
set { _publishTime = value; }

        }

    }

}


MessageProvider

using  System.Configuration.Provider;

using  System.Collections.Generic;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// 操作Message抽象类

    
/// </summary>

    public abstract class MessageProvider : ProviderBase

    
{

        
/// <summary>

        
/// 插入Message

        
/// </summary>

        
/// <param name="mm">Message实体对象</param>

        
/// <returns></returns>

        public abstract bool Insert(MessageModel mm);


        
/// <summary>

        
/// 获得Message

        
/// </summary>

        
/// <returns></returns>

        public abstract List<MessageModel> Get();

    }

}


sqlMessageProvider

using  System;

using  System.Collections.Specialized;

using  System.Collections.Generic;


using  System.Configuration.Provider;

using  System.Configuration;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// sql方式操作Message

    
/// </summary>

    public class sqlMessageProvider : MessageProvider

    
{

        
private string _connectionString;


        
/// <summary>

        
/// 插入Message

        
/// </summary>

        
/// <param name="mm">Message实体对象</param>

        
/// <returns></returns>

        public override bool Insert(MessageModel mm)

        
{

            
// 代码

            return true;

        }


        
/// <summary>

        
/// 获取Message

        
/// </summary>

        
/// <returns></returns>

        public override List<MessageModel> Get()

        
{

            List
<MessageModel> l = new List<MessageModel>();

            l.Add(
new MessageModel("sql方式,连接字符串是" + this._connectionString, DateTime.Now));


            
return l;

        }


        
/// <summary>

        
/// 初始化提供程序。

        
/// </summary>

        
/// <param name="name">该提供程序的友好名称</param>

        
/// <param name="config">名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性</param>

        public override void Initialize(string name, NameValueCollection config)

        
{

            
if (string.IsNullOrEmpty(name))

                name 
= "MessageProvider";


            
if (null == config)

                
throw new ArgumentException("config参数不能为null");


            
if (string.IsNullOrEmpty(config["description"]))

            
{

                config.Remove(
"description");

                config.Add(
"description""sqlServer操作Message");

            }


            
base.Initialize(name, config);


            
string temp = config["connectionStringName"];

            
if (temp == null || temp.Length < 1)

                
throw new ProviderException("connectionStringName属性缺少或为空");


            _connectionString 
= ConfigurationManager.ConnectionStrings[temp].ConnectionString;

            
if (_connectionString == null || _connectionString.Length < 1)

            
{

                
throw new ProviderException("没找到'" + temp + "'所指的连接字符串,或所指连接字符串为空");

            }


            config.Remove(
"connectionStringName");

        }

    }

}


XmlMessageProvider

using  System;

using  System.Collections.Specialized;

using  System.Collections.Generic;


using  System.Configuration.Provider;

using  System.Configuration;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// Xmll方式操作Message

    
/// </summary>

    public class XmlMessageProvider : MessageProvider

    
{

        
private string _connectionString;


        
/// <summary>

        
/// 插入Message

        
/// </summary>

        
/// <param name="mm">Message实体对象</param>

        
/// <returns></returns>

        public override bool Insert(MessageModel mm)

        
{

            
// 代码

            return true;

        }


        
/// <summary>

        
/// 获取Message

        
/// </summary>

        
/// <returns></returns>

        public override List<MessageModel> Get()

        
{

            List
<MessageModel> l = new List<MessageModel>();

            l.Add(
new MessageModel("XML方式,连接字符串是" + this._connectionString, DateTime.Now));


            
return l;

        }


        
/// <summary>

        
/// 初始化提供程序。

        
/// </summary>

        
/// <param name="name">该提供程序的友好名称</param>

        
/// <param name="config">名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性</param>

        public override void Initialize(string name, NameValueCollection config)

        
{

            
if (string.IsNullOrEmpty(name))

                name 
= "MessageProvider";


            
if (null == config)

                
throw new ArgumentException("config参数不能为null");


            
if (string.IsNullOrEmpty(config["description"]))

            
{

                config.Remove(
"description");

                config.Add(
"description""XML操作Message");

            }


            
base.Initialize(name, config);


            
string temp = config["connectionStringName"];

            
if (temp == null || temp.Length < 1)

                
throw new ProviderException("connectionStringName属性缺少或为空");


            _connectionString 
= ConfigurationManager.ConnectionStrings[temp].ConnectionString;

            
if (_connectionString == null || _connectionString.Length < 1)

            
{

                
throw new ProviderException("没找到'" + temp + "'所指的连接字符串,或所指连接字符串为空");

            }


            config.Remove(
"connectionStringName");

        }

    }

}


MessageProviderCollection

using  System.Configuration.Provider;

using  System;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// Message的Provider集合类

    
/// </summary>

    public class MessageProviderCollection : ProviderCollection

    
{

        
/// <summary>

        
/// 向集合中添加提供程序。

        
/// </summary>

        
/// <param name="provider">添加的提供程序。</param>

        public override void Add(ProviderBase provider)

        
{

            
if (provider == null)

                
throw new ArgumentNullException("provider参数不能为null");


            
if (!(provider is MessageProvider))

                
throw new ArgumentException("provider参数类型必须是MessageProvider.");


            
base.Add(provider);

        }

    }

}


MessageProviderConfigurationSection

using  System.Configuration;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// Message的Provider的配置

    
/// </summary>

    public class MessageProviderConfigurationSection : ConfigurationSection

    
{

        
private readonly ConfigurationProperty _defaultProvider;

        
private readonly ConfigurationProperty _providers;

        
private ConfigurationPropertyCollection _properties;

        

        
/// <summary>

        
/// 构造函数

        
/// </summary>

        public MessageProviderConfigurationSection()

        
{

            _defaultProvider 
= new ConfigurationProperty("defaultProvider"typeof(string), null);

            _providers 
= new ConfigurationProperty("providers"typeof(ProviderSettingsCollection), null);

            _properties 
= new ConfigurationPropertyCollection();


            _properties.Add(_providers);

            _properties.Add(_defaultProvider);

        }


@H_404_3335@

        
/// <summary>

        
/// Message的认的Provider

        
/// </summary>

        [ConfigurationProperty("defaultProvider")]

        
public string DefaultProvider

        
{

            
get return (string)base[_defaultProvider]; }

            
set base[_defaultProvider] = value; }

        }


        
/// <summary>

        
/// Message的所有的Provider集合

        
/// </summary>

        [ConfigurationProperty("providers", DefaultValue = "sqlMessageProvider")]

        [StringValidator(MinLength 
= 1)]

        
public ProviderSettingsCollection Providers

        
{

            
get return (ProviderSettingsCollection)base[_providers]; }

        }


        
/// <summary>

        
/// Message的Provider的属性集合

        
/// </summary>

        protected override ConfigurationPropertyCollection Properties

        
{

            
get return _properties; }

        }

    }

}


Message

using  System;

using  System.Collections.Generic;

using  System.Configuration;

using  System.Web.Configuration;


namespace  Pattern.Provider

{

    
/// <summary>

    
/// 暴露给客户端用的Message的类(Context)

    
/// </summary>

    public class Message

    
{

        
private static bool m_isInitialized = false;

        
private static MessageProviderCollection _providers = null;

        
private static MessageProvider _provider = null;


        
/// <summary>

        
/// 静态构造函数,初始化

        
/// </summary>

        static Message()

        
{

            Initialize();

        }


        
/// <summary>

        
/// 插入信息

        
/// </summary>

        
/// <param name="mm">Message实体对象</param>

        
/// <returns></returns>

        public static bool Insert(MessageModel mm)

        
{

            
return _provider.Insert(mm);

        }


        
/// <summary>

        
/// 获取信息

        
/// </summary>

        
/// <returns></returns>

        public static List<MessageModel> Get()

        
{

            
return _provider.Get();

        }


        
private static void Initialize()

        
{

            
try

            
{

                MessageProviderConfigurationSection messageConfig 
= null;


                
if (!m_isInitialized)

                
{


                    
// 找到配置文件中“MessageProvider”节点

                    messageConfig = (MessageProviderConfigurationSection)ConfigurationManager.GetSection("MessageProvider");


                    
if (messageConfig == null)

                        
throw new ConfigurationErrorsException("配置文件中没找到“MessageProvider”节点");


                    _providers 
= new MessageProviderCollection();


                    
// 使用System.Web.Configuration.ProvidersHelper类调用每个Provider的Initialize()方法

                    ProvidersHelper.InstantiateProviders(messageConfig.Providers, _providers, typeof(MessageProvider));


                    
// 所用的Provider为配置中认的Provider

                    _provider = _providers[messageConfig.DefaultProvider] as MessageProvider;


                    m_isInitialized 
= true;


                }

            }

            
catch (Exception ex)

            
{

                
string msg = ex.Message;

                
throw new Exception(msg);

            }

        }


        
private static MessageProvider Provider

        
{

            
get

            
{

                
return _provider;

            }

        }


        
private static MessageProviderCollection Providers

        
{

            
get

            
{

                
return _providers;

            }

        }

    }

}



Web.config

< configuration >

  
< configSections >

    
< section  name ="MessageProvider"  type ="Pattern.Provider.MessageProviderConfigurationSection, Pattern.Provider"   />

  
</ configSections >

  
< MessageProvider  defaultProvider ="sqlMessageProvider" >

    
< providers >

      
< add  name ="XmlMessageProvider"  type ="Pattern.Provider.XmlMessageProvider, Pattern.Provider"  connectionStringName ="XmlConnection"   />

      
< add  name ="sqlMessageProvider"  type ="Pattern.Provider.sqlMessageProvider, Pattern.Provider"  connectionStringName ="sqlConnection"   />

    
</ providers >

  
</ MessageProvider >

  
< connectionStrings >

    
< add  name ="sqlConnection"  connectionString ="server=.;database=db;uid=sa;pwd=sa"   />

    
< add  name ="XmlConnection"  connectionString ="XmlPath"   />

  
</ connectionStrings >

</ configuration >

Test

using  System;

using  System.Data;

using  System.Configuration;

using  System.Collections;

using  System.Web;

using  System.Web.Security;

using  System.Web.UI;

using  System.Web.UI.WebControls;

using  System.Web.UI.WebControls.WebParts;

using  System.Web.UI.HtmlControls;


using  Pattern.Provider;


public  partial  class  Provider : System.Web.UI.Page

{

    
protected void Page_Load(object sender, EventArgs e)

    
{

        Response.Write(Message.Insert(
new MessageModel("插入", DateTime.Now)));

        Response.Write(
"<br />");

        Response.Write(Message.Get()[
0].Message + " " + Message.Get()[0].PublishTime.ToString());

    }

}

运行结果
True
sql方式,连接字符串是server=.;database=db;uid=sa;pwd=sa 2007-1-22 8:21:44

from:http://www.cnblogs.com/webabcd/archive/2007/01/22/626479.html
OK
[源码下载]  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐