• 项目中用到的设计模式(持续更新)


    设计模式的定义:是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。

    设计的六大原则:

     单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

     开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

     里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。

     依赖倒转原则(Dependency Inversion  Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

     接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

     迪米特法则(Law of  Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    接口和抽象类的选择:

    1.优先使用接口

    2.在既要定义子类的行为,又要为子类提供公共的功能时应选择抽象类。

    -------------------------------------------------------创建类模式------------------------------------------------------

    0.简单工厂模式(静态工厂)(本质:选择实现

    public sealed class ContractCardRulesFactory
    {
            public static IContractRules CreateContractRules()
            {
                return new ContractRules()
            }
    }
    public interface IContractRules{
          DataTable GetContractsWithRecAndPay(Dictionary<string, object> filter);
    }
     
    public class ContractRules : IContractRules{
    }

    客户端:

    DataTable dt = ContractCardRulesFactory.CreateContractRules().GetContractsWithRecAndPay(filter);  

    StructureMap:

    IList<T_HZ_MDT> t_HZ_MDTList = ObjectFactory.GetInstance<IDAL_T_HZ_MDT>().GetList(mDTQueryParams);

    1.单例模式(本质:控制实例数目

    public class Message implements Serializable{
    
        /**
         * 消息表
         */
        private static final long serialVersionUID = -3133864495085075021L;
        
        private Message(){}
        
        private static final Message message = new Message();
        
        public static Message getInstance(){
            return message;
        }
    
        private int ID;
        private int VERIFY_TAG;
        private int VERIFY_TYPE;
        private String VERIFY_SBBH;
        private int DR;
        private int CODE;
        private String COLLECTOR_ID;
        public void setID(int iD) {
            ID = iD;
        }
        public int getID() {
            return ID;
        }
        public void setVERIFY_TAG(int vERIFY_TAG) {
            VERIFY_TAG = vERIFY_TAG;
        }
        public int getVERIFY_TAG() {
            return VERIFY_TAG;
        }
        public void setVERIFY_TYPE(int vERIFY_TYPE) {
            VERIFY_TYPE = vERIFY_TYPE;
        }
        public int getVERIFY_TYPE() {
            return VERIFY_TYPE;
        }
        public void setVERIFY_SBBH(String vERIFY_SBBH) {
            VERIFY_SBBH = vERIFY_SBBH;
        }
        public String getVERIFY_SBBH() {
            return VERIFY_SBBH;
        }
        public void setDR(int dR) {
            DR = dR;
        }
        public int getDR() {
            return DR;
        }
        public void setCODE(int cODE) {
            CODE = cODE;
        }
        public int getCODE() {
            return CODE;
        }
        public void setCOLLECTOR_ID(String cOLLECTOR_ID) {
            COLLECTOR_ID = cOLLECTOR_ID;
        }
        public String getCOLLECTOR_ID() {
            return COLLECTOR_ID;
        }
    }

    客户端:

    Message.getInstance().setVERIFY_TAG(3);
    Message.getInstance().setVERIFY_TYPE(1);
    Message.getInstance().setVERIFY_SBBH(ID);
    Message.getInstance().setCODE(code);
    Message.getInstance().setCOLLECTOR_ID(ID);
    insertMessageService.insertMessage();//插入消息表
        public void insertMessage(){
            Map<String,Object> param = new HashMap<String,Object>();
            param.put("ID", getMaxMessageID());
            param.put("verify_tag", Message.getInstance().getVERIFY_TAG());//变动类型标识,新增为1修改为2删除为3
            param.put("verify_type", Message.getInstance().getVERIFY_TYPE());//1是采集设备  2是热表
            param.put("verify_sbbh", Message.getInstance().getVERIFY_SBBH());//采集点编号
            param.put("dr", 0);//默认为0 未同步
            param.put("code", Message.getInstance().getCODE());//厂家编号
            param.put("collector_id", Message.getInstance().getCOLLECTOR_ID());//集中器编号
            fileMaintenanceMapper.insertMessage(param);
        }

    2.工厂方法模式延迟到子类来选择实现)与IOC

    抽象工厂类,具体工厂类,去掉抽象工厂类,变成简单工厂或者静态工厂模式

    3.抽象工厂模式(本质,选择产品簇的实现 )与DAO模式

    工厂方法是单个产品的实现

    多个产品,多个工厂 DbProviderFactory

    DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb"); //获取工厂 这句就可以获得一个工厂,用这个工厂就可发生产该数据提供程序的各种对象了。 
    
    如果是连接 
    
    SqlServer:DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
    Oracle:DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OracleClient"); 
    ODBC:DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.Odbc"); 

    4.建造者模式(本质:分离整体构建算法和部件构造

    .NET环境下的字符串处理StringBuilder,这是一种简化了的建造者模式

    5.原型模式(本质:克隆生成对象

    通过克隆来创建新的对象实例

    为克隆出来的新的对象实例复制原型实例属性的值

        public Object Clone()
            {
                return (Object)this.MemberwiseClone();
            }

    实现克隆操作,在.NET中可以使用Object类的MemberwiseClone()方法来实现对象的浅表拷贝或通过序列化的方式来实现深拷贝。

    ------------------------------------------------------行为类模式-------------------------------------------------------

    6.迭代器模式(本质:控制访问聚合对象中的元素

    能用foreach遍历访问的对象必须是集合或数组对象,而这些都是靠实现超级接口IEnumerator或被声明 GetEnumerator 方法的类型

    7.命令模式封装请求

    (封装请求)事务,Transaction

    例子:

      //抽象命令
        public abstract class Command
        {
            protected Barbecuer receiver;
    
            public Command(Barbecuer receiver)
            {
                this.receiver = receiver;
            }
    
            //执行命令
            abstract public void ExcuteCommand();
        }
     //烤羊肉串命令
        class BakeMuttonCommand : Command
        {
            public BakeMuttonCommand(Barbecuer receiver)
                : base(receiver)
            { }
    
            public override void ExcuteCommand()
            {
                receiver.BakeMutton();
            }
        }
    
        //烤鸡翅命令
        class BakeChickenWingCommand : Command
        {
            public BakeChickenWingCommand(Barbecuer receiver)
                : base(receiver)
            { }
    
            public override void ExcuteCommand()
            {
                receiver.BakeChickenWing();
            }
        }
       //烤肉串者Receiver
        public class Barbecuer
        {
            public void BakeMutton()
            {
                Console.WriteLine("烤羊肉串!");
            }
    
            public void BakeChickenWing()
            {
                Console.WriteLine("烤鸡翅!");
            }
        }
        //服务员Invoker
        public class Waiter
        {
            private IList<Command> orders = new List<Command>();
    
            //设置订单
            public void SetOrder(Command command)
            {
                if (command.ToString() == "命令模式.BakeChickenWingCommand")
                {
                    Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。");
                }
                else
                {
                    orders.Add(command);
                    Console.WriteLine("增加订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString());
                }
            }
    
            //取消订单
            public void CancelOrder(Command command)
            {
                orders.Remove(command);
                Console.WriteLine("取消订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString());
            }
    
            //通知全部执行
            public void Notify()
            {
                foreach (Command cmd in orders)
                {
                    cmd.ExcuteCommand();
                }
            }
        }
        static void Main(string[] args)
            {
                //开店前的准备 客户端
                Barbecuer boy = new Barbecuer();
                Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
                Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
                Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
                Waiter girl = new Waiter();
    
                //开门营业 顾客点菜
                girl.SetOrder(bakeMuttonCommand1);
                girl.SetOrder(bakeMuttonCommand2);
                girl.SetOrder(bakeChickenWingCommand1);
    
                //点菜完闭,通知厨房
                girl.Notify();
    
                Console.Read();
    
            }

    8.解释器模式(本质:分离实现,解释执行

    9.职责链模式分离职责,动态组合

    10.观察者模式(本质:触发联动

    net事件

    11.中介者模式(本质:封装交互

      private System.Windows.Forms.ComboBox comboBox1;
      private System.Windows.Forms.ComboBox comboBox2;
    
        private void InitializeComponent()
            {
                // 
                // comboBox1
                // 
                this.comboBox1.FormattingEnabled = true;
                this.comboBox1.Location = new System.Drawing.Point(51, 25);
                this.comboBox1.Name = "comboBox1";
                this.comboBox1.Size = new System.Drawing.Size(113, 20);
                this.comboBox1.TabIndex = 0;
                // 
                // comboBox2
                // 
                this.comboBox2.FormattingEnabled = true;
                this.comboBox2.Location = new System.Drawing.Point(245, 25);
                this.comboBox2.Name = "comboBox2";
                this.comboBox2.Size = new System.Drawing.Size(109, 20);
                this.comboBox2.TabIndex = 1;

    Windows 窗体设计器

     //国家 colleague
        abstract class Country
        {
            protected UnitedNations mediator;
    
            public Country(UnitedNations mediator)
            {
                this.mediator = mediator;
            }
        }
      //美国 concretecolleague
        class USA : Country
        {
            public USA(UnitedNations mediator)
                : base(mediator)
            {
    
            }
            //声明
            public void Declare(string message)
            {
                mediator.Declare(message, this);
            }
            //获得消息
            public void GetMessage(string message)
            {
                Console.WriteLine("美国获得对方信息:" + message);
            }
        }
    
        //伊拉克concretecolleague
        class Iraq : Country
        {
            public Iraq(UnitedNations mediator)
                : base(mediator)
            {
            }
    
            //声明
            public void Declare(string message)
            {
                mediator.Declare(message, this);
            }
            //获得消息
            public void GetMessage(string message)
            {
                Console.WriteLine("伊拉克获得对方信息:" + message);
            }
    
        }
     //联合国机构 mediator
        abstract class UnitedNations
        {
            /// <summary>
            /// 声明
            /// </summary>
            /// <param name="message">声明信息</param>
            /// <param name="colleague">声明国家</param>
            public abstract void Declare(string message, Country colleague);
        }
     //联合国安全理事会 concretemediator
        class UnitedNationsSecurityCouncil : UnitedNations
        {
            private USA colleague1;
            private Iraq colleague2;
    
            public USA Colleague1
            {
                set { colleague1 = value; }
            }
    
            public Iraq Colleague2
            {
                set { colleague2 = value; }
            }
    
            public override void Declare(string message, Country colleague)
            {
                if (colleague == colleague1)
                {
                    colleague2.GetMessage(message);
                }
                else
                {
                    colleague1.GetMessage(message);
                }
            }
        }

    12.备忘录模式(本质:保存和回恢复内部状态

    (保存和恢复内部状态)

    13.状态模式(工作流,本质:根据状态来分离和选择行为

    14.策略模式(本质:分离算法,选择实现

    public interface IAddFileMaintenance {
        public abstract String AddFileMaintenance();
    }
    public class CreateHeatCompany implements IAddFileMaintenance{
    
        private StringBuilder getheatCompanyList;
        private StringBuilder getProvinceList;
        private StringBuilder getcityList;
        public CreateHeatCompany(StringBuilder getheatCompanyList,
                                 StringBuilder getProvinceList,
                                 StringBuilder getcityList){
            this.getheatCompanyList = getheatCompanyList;
            this.getProvinceList = getProvinceList;
            this.getcityList = getcityList;
        }
        public String AddFileMaintenance() {
            String result = "";
            StringBuilder sb = new StringBuilder();
            sb.append("<table id = 'table_1' width='99%' border='0' cellspacing='0' cellpadding='0'>");
            sb.append("<tr><th width='31%' class='boldth'>热力公司档案</th><td width='69%'>&nbsp;</td></tr>");
            sb.append("<tr><th>热力公司名称:</th><td><input type='text' class='inputbg_td' id='name' maxlength='20' /></td></tr>");
            sb.append("<tr><th>热力公司编号:</th><td><input type='text' class='inputbg_td' id='corp_id' maxlength='12'/></td></tr>");
            sb.append("<tr><th>上级热力公司:</th><td><select id='select1' class='selectbg_td'>");
            sb.append("<option value='0'></option>");
            sb.append(this.getheatCompanyList);
            sb.append("</select></td></tr>");
            sb.append("<tr><th>热力公司地址:</th><td><input type='text' class='inputbg_td' id='address' maxlength='30'/></td></tr>");
            sb.append("<tr><th>地理位置:</th><td><input type='text' class='inputbg_td' id='geo_address' maxlength='30'/></td></tr>");
            sb.append("<tr><th height='73'>所属地区:</th><td><select id='select2' class='selectbg_tdd' onchange='change(this)'>");
            sb.append(this.getProvinceList);
            sb.append("</select>省<select id='select3' class='selectbg_tdd'>");    
            sb.append(this.getcityList);
            sb.append("</select>市</td></tr>");
            sb.append("<tr><th>供热面积:</th><td><input type='text' class='inputbg_td' id='area' maxlength='15' onKeypress='isNumber();'/></td></tr>");        
            sb.append("<tr><td>&nbsp;</td><td align='right'>");
            sb.append("<a onclick='cancel();'><img src='images/hou_btn_11.gif' width='76' height='25' /></a>");
            sb.append("<a onclick='save(1);'><img src='images/hou_btn_03.jpg' width='76' height='25' /></a></td></tr>");
            sb.append("</table>");
            result = sb.toString();
            result = result.replace("'", "\"");
            return result;
        }
    
    }
    public class AddFileMaintenanceContext {
        private IAddFileMaintenance iAddFileMaintenance;
        public AddFileMaintenanceContext(IAddFileMaintenance iAddFileMaintenance){
            this.iAddFileMaintenance = iAddFileMaintenance;
        }
        public String AddFileMaintenance(){
            return this.iAddFileMaintenance.AddFileMaintenance();
        }
    }

    客户端:

        private AddFileMaintenanceContext createHeatCompanyContext() {
            return new AddFileMaintenanceContext(
                    new CreateHeatCompany(getheatCompanyList(),
                              getProvinceList(this.province),
                              getcityList(this.beiJingCity)));
        }

    15.模板方法模式(本质:固定算法骨架

    被继承的抽象类

    16.访问者模式(本质:预留通路,回调实现

    ------------------------------------------------------结构类模式-------------------------------------------------------
    17.适配器模式(本质,转换匹配,复用功能

    复用已有的功能,不是实现新的接口

    对象适配器:

    类适配器:

       public interface ICacheStorage
        {
            void Remove(string key);
            void Store(string key, object data);
            T Retrieve<T>(string storageKey);
        }
        public class HttpContextCache : ICacheStorage
        {
            public void Remove(string key)
            {
                HttpContext.Current.Cache.Remove(key);
            }
    
            public void Store(string key, object data)
            {
                HttpContext.Current.Cache.Insert(key, data);
            }
    
            public T Retrieve<T>(string key)
            {
                T itemStored = (T)HttpContext.Current.Cache.Get(key);
                if (itemStored == null)
                    itemStored = default(T);
    
                return itemStored;
            }
        }

    这里适配的是 : HttpContext

    客户端:

    ICacheStorage cache = new HttpContextCache();
    
    cache.Store("useid", cookie["userid"].ToString());

    18.组合模式(本质是统一叶子对象和组合对象

    具有整体与部分的关系,并能组合成树型结构的对象结构

    19.代理模式(本质:控制对象的访问

    和适配器模式的区别:

       public I6.CM.ContractCard.Entity.ContractEntity.EContractStatus GetContractStatus(string conSystemCode) {
                KernelProxyClient client = new KernelProxyClient();
                object[] result = client.Invoke("I6.CM.ContractCard.Facade.ContractFacade.GetContractStatus", new object[] {
                            conSystemCode}, new int[] {
                            0});
                return ((I6.CM.ContractCard.Entity.ContractEntity.EContractStatus)(result[0]));
            }

    20.桥梁模式分离抽象与实现

    抽象部分和实现部分分离,可以独立的变化,二个纬度以上变化的时候

    java中的JDBC

    21.装饰模式(本质:动态组合

    动态的生成子类

    DataInputStream din = new DataInputStream(
                                         new BufferedInputStream(
                                         new FileInputStream("IOTest.txt")
    )
    );

    AOP:

    22.门面模式(外观模式Facade,本质:封装交互,简化调用

      public bool Update(ref ContractEntity entity,string rightDataType)
            {
                try
                {
                    i6DbHelper.Open();
    
                    IDataRightRules editDataRightRules = DataCatalogRulesFactory.CreateDataRightRules(rightDataType + "_edit");
                    DataRightsForUserEntity editDataRights = GetAllRightForUser(editDataRightRules, entity, AppSessionConfig.LoginID,AppSessionConfig.OCode);
    
                    IDataRightRules viewDataRightRules = DataCatalogRulesFactory.CreateDataRightRules(rightDataType + "_view");
                    DataRightsForUserEntity viewDataRights = GetAllRightForUser(viewDataRightRules, entity, AppSessionConfig.LoginID, AppSessionConfig.OCode);
    
                    i6DbHelper.BeginTran();
                    ContractCardRulesFactory.CreateContractRules().Update(entity);
                 
                    i6DbHelper.CommitTran();
                    return true;
                }
                catch (Exception e)
                {
                    i6DbHelper.RollbackTran();
                    throw e;
                }
                finally
                {
                    i6DbHelper.Close();
                }
            }

    体现了最少知识原则

    23.享元模式(本质:分离与共享

        //缓存菜单
            String result = "";
            if(request.getSession().getAttribute(operatorID + location) == null){
                Map<String,Object> param = new HashMap<String,Object>();
                param.put("operatorID", operatorID);
                param.put("location", location);
                List<Tree> treeList = loginService.getMenusByID(param);
                RightsManagementControllerHelp help = new RightsManagementControllerHelp();    
                help.setTreeList(treeList);
                if(location == SystemType.FrontSystem.value()){
                    result = help.getFrontHtml();
                    systemLogService.saveSystemLog(operatorID, "登录到前台界面");
                }
                else{
                    result = help.getBackHtml();
                    systemLogService.saveSystemLog(operatorID, "登录到后台界面");
                }            
                request.getSession().setAttribute(operatorID + location, result);            
            }else{
                result = request.getSession().getAttribute(operatorID + location).toString();
            }        
            return result;

    做一个享元工厂缓存菜单

    (分离与共享)

     //网站 flyweight
        abstract class WebSite
        {
            public abstract void Use(User user);
        }
       //具体的网站 concreteflyweight
        class ConcreteWebSite : WebSite
        {
            private string name = "";
            public ConcreteWebSite(string name)
            {
                this.name = name;
            }
    
            public override void Use(User user)
            {
                Console.WriteLine("网站分类:" + name + " 用户:" + user.Name);
            }
        }
     //网站工厂flyweightfactory
        class WebSiteFactory
        {
            private Hashtable flyweights = new Hashtable();
    
            //获得网站分类
            public WebSite GetWebSiteCategory(string key)
            {
                if (!flyweights.ContainsKey(key))
                    flyweights.Add(key, new ConcreteWebSite(key));
                return ((WebSite)flyweights[key]);
            }
    
            //获得网站分类总数
            public int GetWebSiteCount()
            {
                return flyweights.Count;
            }
        }
  • 相关阅读:
    同一个人
    11.13作业第十一次AB类
    实类化对象
    字符串数组 输入3个字符串,要求按由小到大的字母顺序输出; 输入n个学生的姓名和学号到字符串数组中,在输入一个姓名,如果班级有该生则返回其信息,否则返回本班无此人
    字符数组
    作业:例题5.7 用选择法对数组中10个整数按由小到大排序。要求使用函数的方法。
    有一个3*4的矩阵,编程求出其中最大值,以及其所在的行号和列号。
    函数重载
    冒泡数组
    裴波那契数列
  • 原文地址:https://www.cnblogs.com/smileberry/p/3054803.html
Copyright © 2020-2023  润新知