C#面向对象的23种设计模式介绍

C#面向对象的23种设计模式介绍》是一篇系统性的介绍C#中常见23种设计模式的文章。下面我将为大家详细讲解这篇文章的完整攻略:

一、前言

文章先介绍了设计模式的概念和作用,以及在软件开发中为什么需要设计模式。同时也会提醒读者,设计模式仅仅是一种思想上的借鉴,不能盲目使用。

二、设计模式的分类

文章接着介绍了设计模式的分类方式,分为三类:创建型模式、结构型模式和行为型模式。分别列举了各类设计模式的特点和使用场景。

三、设计模式的具体介绍

在这一部分,会详细介绍每一种设计模式的定义、实现、优缺点以及代码示例等内容。

1. 创建型模式

工厂方法模式

工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。

在此模式下,具体的工厂由抽象工厂类的派生类实现,在工厂类中调用抽象产品类中定义的方法,返回抽象产品类的实例。

例如,我们需要创建一个接口为IFruit的对象,并且具体实现类为Apple,则可以使用如下代码:

public class Program
{
    static void Main(string[] args)
    {
        // 创建手机工厂对象
        IFruitFactory fruitFactory = new AppleFactory();
        // 生产手机
        IFruit fruit = fruitFactory.Create();
        // 显示手机信息
        fruit.Show();
    }
}

public interface IFruit
{
    void Show();
}

public class Apple : IFruit
{
    public void Show()
    {
        Console.WriteLine("This is an apple.");
    }
}

public interface IFruitFactory
{
    IFruit Create();
}

public class AppleFactory : IFruitFactory
{
    public IFruit Create()
    {
        return new Apple();
    }
}

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。

在此模式下,抽象工厂类定义了一系列方法,具体工厂类实现这些方法,并返回一系列相关对象。

例如,我们需要创建一个手机产品,在此基础上又要有不同的版本(例如屏幕大小、像素等参数)。则可以使用如下代码:

public class Program
{
    static void Main(string[] args)
    {
        // 创建三星工厂对象
        IPhoneFactory samsungFactory = new SamsungFactory();
        // 生产 GalaxyS10
        IPhone samsungPhone = samsungFactory.CreatePhone();
        // GalaxyS10 显示信息
        samsungPhone.Show();
        // 生产 GalaxyS10Display
        IDisplay samsungDisplay = samsungFactory.CreateDisplay();
        // GalaxyS10Display 显示信息
        samsungDisplay.Show();

        // 创建苹果工厂对象
        IPhoneFactory appleFactory = new AppleFactory();
        // 生产 iPhoneX
        IPhone applePhone = appleFactory.CreatePhone();
        // iPhoneX 显示信息
        applePhone.Show();
        // 生产 iPhoneXDisplay
        IDisplay appleDisplay = appleFactory.CreateDisplay();
        // iPhoneXDisplay 显示信息
        appleDisplay.Show();
    }
}

public interface IPhone
{
    void Show();
}

public class SamsungPhone : IPhone
{
    public void Show()
    {
        Console.WriteLine("This is a Samsung phone.");
    }
}

public class ApplePhone : IPhone
{
    public void Show()
    {
        Console.WriteLine("This is an Apple phone.");
    }
}

public interface IDisplay
{
    void Show();
}

public class SamsungDisplay : IDisplay
{
    public void Show()
    {
        Console.WriteLine("This is a Samsung display.");
    }
}

public class AppleDisplay : IDisplay
{
    public void Show()
    {
        Console.WriteLine("This is an Apple display.");
    }
}

public interface IPhoneFactory
{
    IPhone CreatePhone();
    IDisplay CreateDisplay();
}

public class SamsungFactory : IPhoneFactory
{
    public IPhone CreatePhone()
    {
        return new SamsungPhone();
    }

    public IDisplay CreateDisplay()
    {
        return new SamsungDisplay();
    }
}

public class AppleFactory : IPhoneFactory
{
    public IPhone CreatePhone()
    {
        return new ApplePhone();
    }

    public IDisplay CreateDisplay()
    {
        return new AppleDisplay();
    }
}

2. 结构型模式

适配器模式

适配器模式(Adapter Pattern)将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

例如,我们有一个使用220V电压的电视,但我们只有110V的电源,此时就需要将电源适配器中的110V电压转换为220V电压。则可以使用如下代码:

public class Program
{
    static void Main(string[] args)
    {
        // 使用电源适配器
        PowerAdapter adapter = new PowerAdapter();
        adapter.ChangeVoltage();
    }
}

public interface IPower
{
    void Use220V();
}

public class TV : IPower
{
    public void Use220V()
    {
        Console.WriteLine("使用220V电压");
    }
}

public class PowerAdapter
{
    private readonly IPower power;

    public PowerAdapter()
    {
        this.power = new TV();
    }

    public void ChangeVoltage()
    {
        Console.WriteLine("使用电源适配器");
        this.power.Use220V();
    }
}

3. 行为型模式

责任链模式

责任链模式(Chain of Responsibility Pattern)为解除请求的发送者和接收者之间的耦合,而将请求的处理者链式排列,将请求沿着这条链传递,直到有一个处理者能够处理它为止。

例如,我们在一个网站上购买商品时,会出现多种付款方式,如支付宝、微信、银联等,如果某个付款方式被拒绝,则会依次切换到下一个付款方式,直到订单被支付为止。则可以使用如下代码:

public class Program
{
    static void Main(string[] args)
    {
        // 创建支付方式
        PaymentHandler aliPayHandler = new AliPayHandler();
        PaymentHandler wechatPayHandler = new WechatPayHandler();
        PaymentHandler unionPayHandler = new UnionPayHandler();

        // 设置支付方式之间的顺序
        aliPayHandler.SetNextHandler(wechatPayHandler);
        wechatPayHandler.SetNextHandler(unionPayHandler);

        // 客户端输入购买商品的总金额和支付方式,通过支付方式进行支付
        Console.WriteLine("请输入购买商品的总金额:");
        decimal total = decimal.Parse(Console.ReadLine());
        Console.WriteLine("请选择支付方式:1.支付宝 2.微信支付 3.银联支付");
        int payType = int.Parse(Console.ReadLine());
        Payment request = new Payment { Total = total, PayType = (PayTypeEnum)payType };

        aliPayHandler.HandleRequest(request);
    }
}

public enum PayTypeEnum
{
    AliPay = 1,
    WechatPay = 2,
    UnionPay = 3
}

public class Payment
{
    public decimal Total { get; set; }
    public PayTypeEnum PayType { get; set; }
}

public abstract class PaymentHandler
{
    protected PaymentHandler nextHandler;

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

    public abstract void HandleRequest(Payment request);
}

public class AliPayHandler : PaymentHandler
{
    public override void HandleRequest(Payment request)
    {
        if (request.PayType == PayTypeEnum.AliPay)
        {
            Console.WriteLine("使用支付宝支付了{0}元", request.Total);
        }
        else
        {
            if (nextHandler != null)
            {
                nextHandler.HandleRequest(request);
            }
        }
    }
}

public class WechatPayHandler : PaymentHandler
{
    public override void HandleRequest(Payment request)
    {
        if (request.PayType == PayTypeEnum.WechatPay)
        {
            Console.WriteLine("使用微信支付支付了{0}元", request.Total);
        }
        else
        {
            if (nextHandler != null)
            {
                nextHandler.HandleRequest(request);
            }
        }
    }
}

public class UnionPayHandler : PaymentHandler
{
    public override void HandleRequest(Payment request)
    {
        if (request.PayType == PayTypeEnum.UnionPay)
        {
            Console.WriteLine("使用银联支付支付了{0}元", request.Total);
        }
        else
        {
            if (nextHandler != null)
            {
                nextHandler.HandleRequest(request);
            }
        }
    }
}

四、结论

文章最后总结了C#中常见的23种设计模式,还提醒读者在实际应用中需要根据具体情况灵活使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#面向对象的23种设计模式介绍 - Python技术站

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

相关文章

  • C#反射(Reflection)对类的属性get或set值实现思路

    C#反射(Reflection)是C#语言的一项重要特性,它允许在运行时动态的访问和修改.NET程序集中的类型信息。其中,对类的属性进行get或set值也是Reflection的核心功能之一。 在C#中,类的属性可以使用get和set来定义。其中,get可以取得该属性的值,而set可以设置该属性的值。而反射(Reflection)则可以通过以下的步骤来获取和…

    C# 2023年5月31日
    00
  • C# Dockpanel入门基础必看篇

    C# Dockpanel入门基础必看篇 什么是Dockpanel? Dockpanel是一种布局方式,使用Dockpanel可以轻松地将控件水平或垂直对齐,并且可以容易地拉伸控件来扩展面板空间。 如何使用Dockpanel? 步骤一:安装Dockpanel插件 首先,在Visual Studio的“工具”菜单中点击“NuGet包管理器”,在弹出的窗口中选择“…

    C# 2023年5月31日
    00
  • ASP.NET Core 7 Razor Pages项目发布到IIS的详细过程

    以下是关于“ASP.NET Core 7 Razor Pages 项目发布到 IIS 的详细过程”的完整攻略: 1. 准备工作 在将.NET Core 7 Razor Pages 项目发布到 IIS 前,需要进行准备工作: 安装 .NET Core 7 运行时和 SDK。 安装 I。 安装 .NET Core Hosting Bundle 2. 发布项目 在…

    C# 2023年5月12日
    00
  • JavaScript ESLint插件保姆级使用教程

    JavaScript ESLint插件保姆级使用教程 1. 什么是ESLint ESLint是一个可扩展的JavaScript代码检查工具。它可以检查代码中的语法错误,提供一致的代码风格,并可以检测代码中的潜在问题。ESLint 可以配置以满足您的特定需求。ESLint内置了很多规则,您也可以通过使用插件来添加自定义规则。 2. 安装ESLint 2.1 安…

    C# 2023年5月15日
    00
  • silverlight调用淘宝api接口做淘宝客应用

    Silverlight调用淘宝API接口做淘宝客应用 淘宝API是淘宝开放平台提供的一组Web API,可以让开发者通过API接口访问淘宝的商品、店铺、订单等信息。本文将介绍如何使用Silverlight调用淘宝API接口,实现一个简单的淘宝客应用。 1.注册淘宝开放平台应用 首先,我们需要在淘宝开放平台注册一个应用,以获取App Key和App Secre…

    C# 2023年5月15日
    00
  • c#对list排序示例

    下面我来详细讲解一下c#对list排序的攻略。 如何对List排序 在C#中,可以在List类上使用Sort()方法对其进行排序。Sort()方法根据列表中的元素实现了IComparable泛型接口进行比较排序。默认情况下,它按照列表元素的值进行升序排序。 List<int> numList = new List<int>() { 5…

    C# 2023年6月1日
    00
  • 详解ASP.NET MVC之下拉框绑定四种方式

    下面我将详细讲解ASP.NET MVC下拉框绑定四种方式的完整攻略。 一、前置知识 在进行下拉框绑定前,需要了解 ASP.NET MVC 的 Razor 语法和 C# 语言基础,以及了解下拉框的 HTML 语法和 ASP.NET MVC 中的 ViewData 和 ViewBag 这两种传值方式。 二、下拉框绑定四种方式 通过 ViewBag 绑定下拉框 在…

    C# 2023年5月31日
    00
  • SimpleAdmin手摸手教学之:插件管理

    一、前言 在2.0的架构设计中,引入了插件的概念,目的就是为了解决代码臃肿问题,随着系统功能越来越多,System层的代码也越来越多,之前是以文件夹的方式区分功能模块,这样的话代码就过于集中,想找到某一个功能模块的代码就要翻好几个文件夹,不利于以后的开发和维护。所以在新的架构中,我将部分功能模块通过插件的方式提取出来,封装成类库形式的插件,这样System层…

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