设计模式--提供者模式provider

2023-11-19



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




介绍
为一个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);
        }


        /// <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
<? xml version="1.0" encoding="utf-8" ?>
< 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
乐在其中设计模式(C#) - 提供者模式(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);
        }


        /// <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
<? xml version="1.0" encoding="utf-8" ?>
< 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式--提供者模式provider 的相关文章

  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • 离散仿真引擎基础作业与练习

    作业内容 一 简答题 1 解释 GameObjects 和 Assets 的区别与联系 2 下载几个游戏案例 分别总结资源 对象组织的结构 3 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件 4 了解 GameO
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • 行为型模式-状态模式

    package per mjn pattern state after 环境角色类 public class Context 定义对应状态对象的常量 public final static OpeningState OPENING STAT
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • 程序员必知的23种设计模式之组合模式

    文章目录 1 模式引出 学校院系展示需求 1 1 传统方案 1 2 传统方案问题分析 2 组合模式基本介绍 2 1 方案修改 3 组合模式解决的问题 4 组合模式的注意事项和细节 1 模式引出 学校院系展示需求 编写程序展示一个学校院系结构
  • 组合型模式

    概述 对于这个图片肯定会非常熟悉 上图我们可以看做是一个文件系统 对于这样的结构我们称之为树形结构 在树形结构中可以通过调用某个方法来遍历整个树 当我们找到某个叶子节点后 就可以对叶子节点进行相关的操作 可以将这颗树理解成一个大的容器 容器
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • Java设计模式:模板方法模式

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于 Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得 关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 一 模板方法模式的定义 二 模板方
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest

随机推荐

  • string (std::string)转换为QString的用法(含中文)

    string s 123 QString str QString fromStdString s 含中文时的转换 std string str 你好世界 QString Name QString fromLocal8Bit str c st
  • redis配置认证密码

    redis配置密码 1 通过配置文件进行配置 yum方式安装的redis配置文件通常在 etc redis conf中 打开配置文件找到 requirepass foobared去掉行前的注释 并修改密码为所需的密码 保存文件 requir
  • 2-数据结构-线性表之顺序表的动态分配

    说明 由于原来顺序表的静态分配 浪费空间 且存在溢出现象 因此采取动态分配的方式 创建顺序表中的数组 跟C语言正常动态分配一样 需要直到扩充的大小 和数组指针即可 代码如下 看着多 其实原理差不多 主要知道哪些操作即可 无需了解具体代码 i
  • 基于深度学习的文本分类系统(完整代码+数据)bert+rnn textcnn fastcnn bert

    程序说明 硬件 GPU Tesla V100 32GB显存 内存 32GB
  • OpenFace库(Tadas Baltrusaitis)中基于HOG进行正脸人脸检测的测试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具 它的源码可以从https github com TadasBaltrusaitis OpenFace下载 OpenFace主要包括面部关键点检测 facia
  • 计算机毕业设计项目大全

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • 美化github首页

    创建仓库 注 新建仓库的名字要和自己的名字完全一致 提交的源码必须在主分支上 master或者main 配置完成 回到你的主页 你就能看到在置顶项目的上方多了一个README md 编辑改文件即可 美化首页源码 1 github概览数据 G
  • 若依框架中@DataScope数据权限注解的使用与自定义sql语句。

    介绍 若依框架本身具有角色 部门 用户业务 在业务中 用户必须绑定一个角色 而角色又必须将自身绑定到部门 角色绑定了哪些部门 就决定着隶属于该角色的用户能对哪些部门数据进行增删改 那么 怎么实现让用户只能遵循其绑定角色所指定的部门 来进行数
  • 分布式CAP定理,为什么不能同时满足三个特性?

    在弄清楚这个问题之前 我们先了解一下什么是分布式的CAP定理 根据百度百科的定义 CAP定理又称CAP原则 指的是在一个分布式系统中 Consistency 一致性 Availability 可用性 Partition tolerance
  • linux rhel6 nvidia 卡 在启动界面,RHEL6上安装Nvidia显卡驱动

    二 在字符界面下 运行级3 运行驱动安装程序 在RHEL6上因为Nouveau的关系会出现下面的错误 因此需要将该模块禁用掉 root rhel6 sh NVIDIA Linux x86 64 275 09 07 run Verifying
  • 如何编译SQLite-How To Compile SQLite

    SQLite是ANSI C的源代码 在使用之前必须要编译成机器码 这篇文章是用于各种编译SQLite方法的指南 这篇文章不包含编译SQLite的每个步骤的反馈 那样可能会困难因为每种开发场景都不同 所以这篇文章描述和阐述了编译Sqlite的
  • 区块链应用开发(智能合约的开发和WeBASE合约IDE的使用)

    文章目录 四 智能合约的开发和WeBASE合约IDE的使用 一 实验概述 二 实验目标 三 实验环境及建议 四 实验步骤 4 1 启动Webase 4 2 智能合约开发 4 2 1 合约功能设计 4 2 2 存证合约开发 4 2 3 工厂合
  • 浅析赋值、浅拷贝、深拷贝的区别

    1 原理 赋值 将某一对象赋给某个变量的过程 称为赋值 浅拷贝 浅拷贝是创建一个对象 这个对象有着原始对象属性值的一份精准拷贝 如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址 如果其中一个对象改变了这个地
  • 寒假训练 第二节 数据结构基础 总结

    数组 定义 语言支持数组数据结构 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据 但它往往被认为是一系列相同类型的变量 所有的数组都是由连续的内存位置组成 最低的地址对应第一个元素 最高的地址对应最后一个元素 数组
  • python 爬虫 GET(带参) 请求 配置params参数

    import requests 发送网络请求 response requests get http httpbin org get name Jack age 30 print response text 输出结果 args age 30
  • 2019北邮网安院机试真题(回忆版)@lantin

    2019北邮网安院机试真题 回忆版 细不谈 前两题真的都是签到题 会简单排序和if else都可以写的出来的题目 网安院的机试基本上是两道签到题 C题是数据结构题 D题是算法 做到保2争3 保3争4面试不出原则问题基本上复试稳了 Probl
  • Qt系列文章之 mousePressEvent

    上一篇文章介绍QTabWidget的使用技巧 本文开始介绍Qt最常用的事件之一QMouseEvent 鼠标事件 mousePressEvent 鼠标事件是Qt中十分重要的人机交互形式 鼠标事件包括很多内容 此处先介绍最基本的mousePre
  • MySQL 表分区 A PRIMARY KEY must include all columns in the table's partitioning function

    当我们在对MySQL的数据表进行分区的时候 很容易碰到如下错误 A PRIMARY KEY must include all columns in the table s partitioning function 意思是说分区的字段必须是
  • Qt 不规则窗口,不规则按钮,不规划控件 不规则界面

    有一些特殊情况 需要使用不规则窗口或按钮 看起来非常炫酷 类似 Qt 实现 不规则样式设置 不是视觉欺骗 是真正的不规则 点击外面不会触发按钮的点击信号 Part1 不规则窗口 效果 显示成一张图片中的图形 使用带有透明区域的png图片 i
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文