C#设计模式实现之生成器模式和责任链模式

作者:SpringSun 时间:2023-12-19 21:57:51 

目录
  • 生成器

    • 设计类图:

    •  实现代码:

    • 优点:

    • 用途与缺点:

  • 责任链

    • 设计类图:

    • 实现代码:

    • 优点:

    • 用途和缺点:

  • 总结

    生成器

    生成器模式:封装一个产品的构造过程,并允许按步骤构造。

    现又一个度假计划指定,需要指定度假每一天的活动、旅馆、用餐、门票等等事情,但是每个客人的度假计划可能不太一样。例如天数、活动类型、用餐等等。

    C#设计模式实现之生成器模式和责任链模式

    我们需要一个弹性的数据结构,代表客人的规划,以及不同的变化,也需要一系列潜在复杂顺序,创建这样的规划。如何提供一种方式来创建复杂的结构,也不会和创建它的步骤混在一起。迭代器的过程就是封装进一个独立的对象中,向客户隐藏集合的内部表现。这里我们也采用同样的思路:我们将旅游规划的创建过程,封装到一个对象中(此对象称为生成器),然后让客户调用生成器为它创建旅游规划。

    设计类图:

    C#设计模式实现之生成器模式和责任链模式

     实现代码:

    ①存储数据结构类


        public class Vacation
        {
            public int Day { get; set; }
            public string Hotel { get; set; }
            public string Park { get; set; }
            public string Activity { get; set; }
            public string Meal { get; set; }
        }

    ②抽象生成器


        public abstract class AbstractBuilder
        {
            public abstract void BuildDay(int day);
            public abstract void Hotel(string hotel);
            public abstract void Park(string park);
           public abstract void Activity(string activity);
            public abstract void Meal(string meal);
            public abstract Vacation GetVacationPlanner();
        }

    ③具体生成器,具体生成器可以多个实现。


        public class VacationBuilder : AbstractBuilder
        {
            private Vacation vacation=new Vacation();

    public override void BuildDay(int day)
            {
                vacation.Day = day;
            }

    public override void Hotel(string hotel)
            {
                vacation.Hotel = hotel;
            }
            public override void Activity(string activity)
            {
                vacation.Activity = activity;
            }
            public override void Meal(string meal)
            {
                vacation.Meal = meal;
            }

    public override void Park(string park)
            {
                vacation.Park = park;
            }

    public override Vacation GetVacationPlanner()
            {
                return vacation;
            }
        }

    ④客户使用生成器

    优点:

    1、将复杂对象创建过程封装起来。

    2、允许对象通过多个步骤来创建,并且可以改变过程。

    3、向客户隐藏产品内部表现。

    4、产品的实现可以被替换,因为客户只看到一个抽象的接口。

    用途与缺点:

    1、经常用来创建组合结构。

    2、与工厂模式相比,采用生成器创建对象的客户需要更多的领域知识,才能正确的创建对象。

    责任链

    责任链模式:让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。

    有这样一个场景,公司专门接受邮件处理的人员需要将每天接收到的邮件进行处理,一类是需要转给部门经理处理的邮件,一类是给自己处理的,还有一类垃圾邮件直接删除。如果这样的一个场景,我们就可以通过责任链模式,为处理创建一个对象链。每个对象依序检查邮件请求,并进行处理,或者将它传递给链中的下一个对象。

    设计类图:

    C#设计模式实现之生成器模式和责任链模式

    实现代码:

    ①责任链抽象类


        /// <summary>
        /// 邮件类型
        /// </summary>
        public enum EmailType
        {
            Self=1,
            Manager=2,
            Del=3
        }

    public abstract class Handler
        {
            public Handler nextHandler;
            public EmailType type;

    public Handler(EmailType type) {
                this.type = type;
            }

    public void SetNextHandler(Handler nextHandler)
            {
                this.nextHandler = nextHandler;
            }

    public abstract void HandleRequest(EmailType requsetType);

    }

    ②责任链处理类


        /// <summary>
        /// 自己处理
        /// </summary>
        class SelfHandler : Handler
        {
            public SelfHandler() : base(EmailType.Self)
            {
            }

    public override void HandleRequest(EmailType requsetType)
            {
                if (EmailType.Self == requsetType)
                {
                    Console.WriteLine("邮件由自己处理");
                }
                else
                {
                    if (nextHandler != null)
                    {
                        nextHandler.HandleRequest(requsetType);
                    }
                }
            }
        }

        /// <summary>
        /// 转发经理
        /// </summary>
        class ManagerHandler : Handler
        {
            public ManagerHandler() : base(EmailType.Manager)
            {
            }

    public override void HandleRequest(EmailType requsetType)
            {
                if (EmailType.Manager == requsetType)
                {
                    Console.WriteLine("邮件转到经理处理");
                }
                else
                {
                    if (nextHandler != null)
                    {
                        nextHandler.HandleRequest(requsetType);
                    }
                }
            }
        }

        /// <summary>
        /// 删除垃圾邮件
        /// </summary>
        class DelHandler : Handler
        {
            public DelHandler() : base(EmailType.Del)
            {
            }

    public override void HandleRequest(EmailType requsetType)
            {
                if (EmailType.Del == requsetType)
                {
                    Console.WriteLine("垃圾邮件已删除");
                }
                else
                {
                    if (nextHandler != null)
                    {
                        nextHandler.HandleRequest(requsetType);
                    }
                }
            }
        }

    ③测试责任链


        class Program
        {
            static void Main(string[] args)
            {
                //组装责任链
                Handler handler = new SelfHandler();
                Handler handler1 = new ManagerHandler();
                Handler handler2 = new DelHandler();
                handler.SetNextHandler(handler1);
                handler1.SetNextHandler(handler2);
                //测试
                handler.HandleRequest(EmailType.Del);
                handler.HandleRequest(EmailType.Manager);
                handler.HandleRequest(EmailType.Self);

    Console.ReadKey();
            }
        }

    C#设计模式实现之生成器模式和责任链模式

    优点:

    1、请求的发送者和接收者解耦。

    2、简化对象,因为不需要知道链的结构。

    3、通过改变链内的成员或调动他们的次序,允许你动态地新增或者删除责任。

    用途和缺点:

    1、经常被用在窗口系统中,处理鼠标和键盘之类的事件。

    2、并不保证请求一定被执行,如果没有任何对象处理它,可能会落到链尾端之外。

    3、不容易观察允许特征,不好排查问题。

    来源:https://juejin.cn/post/6996832278135472141

    标签:生成器模式,责任链模式,设计模式
    0
    投稿

    猜你喜欢

  • java返回json请求中文变成问号的问题及解决

    2023-11-01 02:56:34
  • javax.mail.SendFailedException: Sending failed问题原因

    2021-08-07 20:00:57
  • Java数据结构之ArrayList从顺序表到实现

    2022-06-14 00:53:25
  • C#实现XML文件读取

    2023-03-06 13:38:44
  • C++实现图书馆管理系统源码

    2022-05-19 14:30:02
  • C#值类型、引用类型中的Equals和==的区别浅析

    2022-09-05 23:04:24
  • 详解mybatis插入数据后返回自增主键ID的问题

    2021-09-04 19:08:00
  • Java字典生成算法讲解

    2023-11-25 00:17:29
  • Android垃圾回收机制解决内存泄露问题

    2021-08-29 09:20:55
  • Java DOM4J方式生成XML的方法

    2022-07-19 02:32:42
  • C# 通过ServiceStack 操作Redis

    2023-12-13 06:18:01
  • 带你了解如何使用Spring基于ProxyFactoryBean创建AOP代理

    2022-04-28 09:17:37
  • 安卓(Android)动态创建多个按钮并添加监听事件

    2023-04-25 16:11:43
  • 详解Java ES多节点任务的高效分发与收集实现

    2021-08-03 13:59:02
  • android activity设置无标题实现全屏

    2023-04-22 15:56:52
  • Java中的Struts2框架拦截 器之实例代码

    2023-06-21 19:04:03
  • 详解Spring-Boot中如何使用多线程处理任务

    2022-05-14 13:10:40
  • Android串口通讯SerialPort的使用详情

    2022-03-08 00:23:46
  • Android亮屏和熄屏控制实例详解

    2023-10-12 06:57:04
  • java文件重命名(文件批量重命名)实例程序代码分享

    2023-07-20 06:45:06
  • asp之家 软件编程 m.aspxhome.com