设计模式--提供者模式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 的相关文章

  • Spring源码学习之BeanDefinition源码解析

    本文作者 磊叔 GLMapper本文链接 https juejin cn post 6844903553820000269 Bean的定义主要由BeanDefinition来描述的 作为Spring中用于包装Bean的数据结构 今天就来看看
  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法
  • 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种 控制对其他对象的访问 起到中介作用 代理模式核心角色 真实角色 代理角色 按实现方式不同分为静态代理和动态代理两种 意图 控制对其它对象的访问 类图 实现 JDK自带了Proxy的实现 下面我们先使用JD
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系
  • Java设计模式-装饰者模式Decorator

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

    package per mjn pattern state after 环境角色类 public class Context 定义对应状态对象的常量 public final static OpeningState OPENING STAT
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • 设计模式学习之装饰器模式

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

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • 程序员必知的23种设计模式之组合模式

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

    访问者模式 把被操作的对象作为元素 可变可拓展的操作作为访问者 可以说访问者中有很多操作 然后访问者访问元素 对该元素进行操作 不同的访问者有不同的操作 案例 定义访问者接口 public interface UniversalVisito
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 组合型模式

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

    一 概念 如果在一个系统中存在多个相同的对象 那么只需要共享一份对象的拷贝 而不必为每一次使用都创建新的对象 目的是提高系统性能 上面的概念乍一听好像单例模式其实不是 单例模式只保存一个对象 但是这里可以有很多个不同对象 但是每个对象只有一
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 自动化测试面试题(附答案)

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

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 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文件里 根据配置文