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#实现简易点餐功能

    C#实现简易点餐功能攻略 1. 需求分析 用户选择菜品加入购物车 当前购物车中的商品可以查看 可以进行商品数量的增加和减少 可以清空购物车 2. 技术准备 开发工具:Visual Studio 2019 编程语言:C# 需要使用的控件:ListView、Button、Label 3. 界面设计 根据需求分析,我们需要以下几个控件: ListView用于展示购…

    C# 2023年6月6日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,常规篇

    本文为大家介绍使用 .NET Core部署到Linux服务器的方法,通过本文你将了解到Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程,本文皆在总结了一些经验与笔记在部署过程中遇到的一些问题,同时分享给大家,供大家参考,欢迎讨论交流。 1、Linux操作系统、X…

    C# 2023年4月28日
    00
  • 解决在Unity中使用FairyGUI遇到的坑

    请您认真阅读下面的攻略: 解决在Unity中使用FairyGUI遇到的坑 问题描述 在Unity中使用FairyGUI进行UI制作,其实现机制是在编辑器中制作UI,同时生成对应的xml和bin文件,然后在Unity中通过代码加载bin文件实现UI展示。但是在操作过程中,我们可能会遇到以下问题: 在Unity中加载FairyGUI生成的.bin文件时,Unit…

    C# 2023年5月15日
    00
  • c#根据文件类型获取相关类型图标的方法代码

    获取相关文件类型图标是开发文件管理器、文件上传下载等功能中常用的技术,以下是使用C#获取文件类型图标的方法代码完整攻略。 Step 1:引入命名空间 使用C#获取文件类型图标需要引入System.Drawing和System.Runtime.InteropServices命名空间。 using System.Drawing; using System.Run…

    C# 2023年6月1日
    00
  • ASP.NET中application对象的使用介绍

    ASP.NET中的Application对象是在网站全局范围内保存的一个数据容器,可以通过Application对象在多个页面间传递数据。本文将介绍ASP.NET中Application对象的使用方法,包括创建并保存数据、访问数据、以及如何在多个页面之间传递数据等。 创建并保存数据 在ASP.NET网站中,可以通过以下代码创建一个Application对象以…

    C# 2023年5月31日
    00
  • C# String.Equals()方法: 比较两个字符串是否相等

    String.Equals()方法用于比较两个字符串对象的值是否相等,返回一个布尔值。该方法有多种重载形式,可以按照需要选择不同的形式使用。 下面详细讲解String.Equals()的作用和使用方法: 作用 String.Equals()方法用于比较两个字符串对象的值是否相等,返回一个布尔值。该方法可以用于比较任意两个字符串,包括空字符串,但需要注意的是,…

    C# 2023年4月19日
    00
  • C#实现餐厅管理系统

    C#实现餐厅管理系统是一个非常实用的练手项目,本篇文章将为大家分享如何通过C#编写实现一个简单的餐厅管理系统。 步骤一:需求分析 在编写程序之前,我们需要进行需求分析,明确系统功能以及每个功能的具体实现方式。对于餐厅管理系统而言,我们需要实现以下功能:- 点餐功能:包含选桌位、点菜、计算价格、打印账单等子功能;- 员工管理功能:包含员工入职、离职、工资发放等…

    C# 2023年6月7日
    00
  • 使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

    在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使用涉及太多细节的操作,我们可以把相关的数据绑定操作,放在一些辅助类的扩展函数中进行处理,这样可以更方便的,更简洁的处理数据绑定操作,本篇随笔介绍TreeList…

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