服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#设计模式实现之生成器模式和责任链模式

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

2022-11-30 11:38SpringSun C#

学完设计模式之后,你就感觉它会慢慢地影响到你写代码的思维方式,下面这篇文章主要给大家介绍了关于C#设计模式实现之生成器模式和责任链模式的相关资料,需要的朋友可以参考下

生成器

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

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

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

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

设计类图:

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

 实现代码:

①存储数据结构类

?
1
2
3
4
5
6
7
8
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; }
}

②抽象生成器

?
1
2
3
4
5
6
7
8
9
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();
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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#设计模式实现之生成器模式和责任链模式

实现代码:

①责任链抽象类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/// <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);
    
}

②责任链处理类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <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);
            }
        }
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <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);
            }
        }
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <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);
            }
        }
    }
}

③测试责任链

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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、不容易观察允许特征,不好排查问题。

总结

到此这篇关于C#设计模式实现之生成器模式和责任链模式的文章就介绍到这了,更多相关C#生成器模式和责任链模式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6996832278135472141

延伸 · 阅读

精彩推荐
  • C#C#操作数据库中存取图片文件的方法

    C#操作数据库中存取图片文件的方法

    这篇文章主要介绍了C#操作数据库中存取图片文件的方法,以实例形式分析了C#将图片存入数据库及从数据库读取图片文件的相关技巧,具有一定参考借鉴价值...

    weiren200611032021-10-28
  • C#ToLua框架下C#与Lua代码的互调操作

    ToLua框架下C#与Lua代码的互调操作

    这篇文章主要介绍了ToLua框架下C#与Lua代码的互调操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    达也酱4022022-10-17
  • C#C# 枚举的使用简介

    C# 枚举的使用简介

    这篇文章主要介绍了C# 枚举的简单使用,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    熊泽-学习中的苦与乐10982022-11-07
  • C#C#实现日期格式转换的公共方法类实例

    C#实现日期格式转换的公共方法类实例

    这篇文章主要介绍了C#实现日期格式转换的公共方法类,结合完整实例形式分析了C#针对各种常见日期格式的转换方法,涉及C#字符串、日期、时间相关操作技...

    pan_junbiao9392021-12-21
  • C#轻松学习C#的正则表达式

    轻松学习C#的正则表达式

    轻松学习C#的正则表达式,对C#的正则表达式感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的正则表达式。...

    丿木呈广予口贝5232021-11-03
  • C#unity3D实现三维物体跟随鼠标

    unity3D实现三维物体跟随鼠标

    这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    萌面刺客6362022-08-15
  • C#C# Winform 实现TCP发消息

    C# Winform 实现TCP发消息

    这篇文章主要介绍了C# Winform 实现TCP发消息的示例,帮助大家更好的理解和学习使用c#技术,感兴趣的朋友可以了解下...

    小草上飞飞3402022-11-08
  • C#c# this关键字用法代码详解

    c# this关键字用法代码详解

    在本篇文章里小编给大家整理的是关于c# this关键字用法以及相关实例代码,有兴趣的朋友们可以学习下。...

    inner_cosmos5362022-08-27