C#设计模式之行为型模式详解

C#设计模式之行为型模式详解

什么是行为型模式

行为型模式是面向对象设计中的一类设计模式,主要关注对象之间的交互和通信,以及对象的职责分配。它们描述了对象的行为,而不是它们的标识或状态。这些模式涉及到算法与对象间职责的分配,其中包括职责链、命令、解释器、迭代器、中介者、回调、观察者、状态、策略和模板方法等实现方法。

为什么需要行为型模式

在开发软件的过程中,我们需要大量使用到对象的行为,比如对象之间的通信、请求和响应等。如果我们没有合理的设计,这些行为很有可能导致代码的混乱和耦合,也会使代码难以维护和扩展。行为型模式可以帮助我们更好地组织代码,使得对象间的交互变得更加清晰、可维护、可扩展,同时也提高了代码的重用性和可读性。

常用的行为型模式及示例说明

命令模式

命令模式( Command Pattern ),将请求放置于对象之间, 并由不同的对象来完成请求的处理。这个模式所涉及到的角色有:

  • 命令角色(Command): 声明执行操作的 接口。
  • 具体命令角色(ConcreteCommand):命令接口实现对象,通常会持有接受者并调用接受者的功能来完成命令要执行的操作。
  • 接受者角色(Receiver): 顾名思义,就是接受者,终于真正执行命令并完成相关操作的对象。
  • 请求者角色(Invoker): 发送命令并要求命令执行请求的对象。
  • 客户端角色(Client): 创建具体的Command对象,并设置命令的接收者,即具体的Receiver对象。

示例说明:

public interface ICommand
{
    void Execute();
}

public class ConcreteCommand : ICommand
{
    private Receiver _receiver;

    public ConcreteCommand(Receiver receiver)
    {
        _receiver = receiver;
    }

    public void Execute()
    {
        _receiver.Action();
    }
}

public class Receiver
{
    public void Action()
    {
        Console.WriteLine("Receiver Action");
    }
}

public class Invoker
{
    private ICommand _command;

    public void SetCommand(ICommand command)
    {
        _command = command;
    }

    public void ExecuteCommand()
    {
        _command.Execute();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Receiver receiver = new Receiver();

        ConcreteCommand cmd = new ConcreteCommand(receiver);

        Invoker invoker = new Invoker();

        invoker.SetCommand(cmd);

        invoker.ExecuteCommand();
    }
}

观察者模式

观察者模式( Observer Pattern ),又称发布订阅模式( Publish/Subscribe Pattern ),它是一种行为型模式。在该模式中,一个主题对象管理所有依赖它的观察者对象,并自动通知它们,以使它们能够自动更新自己。这个模式所涉及到的角色有:

  • 抽象主题角色(Subject):该类定义了主题的核心功能,管理了所有观察者对象,提供增加或删除观察者的方法。
  • 具体主题角色(ConcreteSubject):具体主题实现从抽象主题角色继承下来的功能,它通常包含有关该主题状态的具体信息,并对状态进行更改。
  • 抽象观察者角色(Observer):该接口定义了观察者的方法,接受到主题发生变化的通知后即进行相应的操作。
  • 具体观察者角色(ConcreteObserver):具体实现的观察者,在接到通知后将进行更新操作。

示例说明:

public interface IObserver<T>
{
    void Update(T data);
}

public interface IObservable<T>
{
    void AddObserver(IObserver<T> observer);
    void RemoveObserver(IObserver<T> observer);
    void NotifyObservers(T data);
}

public class WeatherData : IObservable<double>
{
    private List<IObserver<double>> _observers = new List<IObserver<double>>();
    private double _temperature;

    public void AddObserver(IObserver<double> observer)
    {
        _observers.Add(observer);
    }

    public void NotifyObservers(double data)
    {
        foreach (var observer in _observers)
        {
            observer.Update(data);
        }
    }

    public void RemoveObserver(IObserver<double> observer)
    {
        _observers.Remove(observer);
    }

    public void SetTemperature(double temperature)
    {
        _temperature = temperature;
        NotifyObservers(temperature);
    }
}

public class CurrentConditionsDisplay : IObserver<double>
{
    private double _temperature;

    public void Update(double data)
    {
        _temperature = data;
        Console.WriteLine($"Current temperature is {_temperature}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var weatherData = new WeatherData();
        var currentConditionsDisplay = new CurrentConditionsDisplay();
        weatherData.AddObserver(currentConditionsDisplay);
        weatherData.SetTemperature(25);
    }
}

结语

以上是C#设计模式之行为型模式的详细介绍及示例说明,通过学习这些常用的行为型模式,可以使我们更好地组织代码,使得对象间的交互变得更加清晰、可维护、可扩展,同时也提高了代码的重用性和可读性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#设计模式之行为型模式详解 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#向Word插入排版精良的TextBox

    C#向Word插入排版精良的TextBox 简介 在使用C#开发Word插件的过程中,我们经常需要在Word文档中插入特殊的控件,例如TextBox等,来进行一些比较特殊的排版。本文将为大家介绍如何使用C#向Word中插入排版精良的TextBox。 步骤 第一步:添加Microsoft Word Object Library引用 在Visual Studio…

    C# 2023年6月7日
    00
  • C#检查指定对象是否存在于ArrayList集合中的方法

    首先,需要注意的是ArrayList是一个已经过时的集合类,更好的选择是使用List<T>泛型集合。 对于C#检查指定对象是否存在于ArrayList集合中的方法,可以通过ArrayList自带的Contains方法进行判断。Contains方法用于判断一个元素是否存在于ArrayList集合中,如果存在则返回true,否则返回false。 以下…

    C# 2023年5月31日
    00
  • .Net Core 实现图片验证码的实现示例

    下面我会为您详细讲解如何实现“.Net Core 实现图片验证码的实现示例”。 一、需求分析 在实现图片验证码之前,我们需要分析一下实现的需求,常见需求包括:生成图片验证码,并将验证码存储到Session或数据库中,校验用户输入的验证码是否正确。在本例中,我们将采用生成图片验证码和校验用户输入的验证码是否正确这两个功能。 二、Bulid项目 我们首先需要创建…

    C# 2023年6月3日
    00
  • 详解C#中线程传参,返回值和多线程冲突问题的解决

    详解C#中线程传参,返回值和多线程冲突问题的解决 前言 在C#中使用多线程可以有效提高程序的运行效率,但是使用多线程也涉及到一些问题,比如线程传参、线程返回值和多线程冲突问题。本文将详细介绍如何在C#中解决这些问题。 线程传参 线程传参是指在创建线程时,将一些数据传递给线程使用。在C#中,线程传参有多种方式,例如使用Thread类的构造函数、使用Parame…

    C# 2023年6月6日
    00
  • C#中的正则表达式双引号问题

    C#中的正则表达式中双引号问题,主要是因为C#语言本身使用双引号来定义字符串,而正则表达式中也常常需要使用双引号来定义某些模式。因此,在将正则表达式作为字符串处理时,需要注意双引号字符的转义问题。 1. 双引号的转义 在C#中,要在字符串中插入双引号字符,需要使用反斜杠(\)字符进行转义,例如: string str = "This is a \&…

    C# 2023年6月7日
    00
  • asp.net中生成缩略图并添加版权实例代码

    你需要掌握以下内容: 通过使用 System.Drawing 命名空间,将图片文件读入 Bitmap 对象。 创建一个新的 Bitmap 对象,调用 Graphics 对象将原始图片画到新的 Bitmap 对象上,并指定新的大小。 通过 Image.Save 方法将缩略图保存为新的文件。 添加版权信息。 下面是示例代码和详细步骤: 1. 通过使用 Syste…

    C# 2023年5月31日
    00
  • 全面解读C#编程中的析构函数用法

    全面解读C#编程中的析构函数用法 什么是析构函数? 析构函数(Destructor)是C#的一个重要特性,可以在对象被销毁之前执行某些操作,比如释放对象使用的资源等,该函数在类中只能有一个,无返回值类型和参数列表。 析构函数使用场景 析构函数通常用于释放由类对象分配的资源,例如在构造函数中申请一段内存,并在析构函数中释放。以确保内存能够被及时释放,从而避免内…

    C# 2023年5月31日
    00
  • JS实现按比例缩放图片的方法(附C#版代码)

    接下来我将详细讲解“JS实现按比例缩放图片的方法(附C#版代码)”的完整攻略。 1. 前言 当你需要在网站上展示图片时,通常需要在页面中调整图片的大小。但是,如果缩放不当,可能导致图片失真,影响用户体验。因此,本文将介绍一种JS实现按比例缩放图片的方法,避免图片失真。 2. 实现步骤 本方法分为以下几个步骤: 2.1 获取图片信息 首先,需要通过JS获取图片…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部