首页 > 编程语言 >C#中的设计模式:构建更加优雅的代码

C#中的设计模式:构建更加优雅的代码

时间:2025-01-03 22:02:01浏览次数:3  
标签:C# void component 优雅 class Operation 设计模式 public

C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。


引言

设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发的程序员来说,理解和应用这些模式可以帮助创建结构良好、易于维护和扩展的应用程序。本文将介绍几种常用的设计模式,并展示如何用C#实现它们。

单例模式 (Singleton Pattern)

单例模式确保一个类只有一个实例,并提供全局访问点。它常用于需要控制资源访问的情况,比如数据库连接池或配置管理器。

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();

    // Private constructor to prevent instantiation.
    private Singleton() { }

    public static Singleton Instance
    {
        get { return instance; }
    }
}
工厂方法模式 (Factory Method Pattern)

工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。这种方式将对象创建的责任交给子类,增加了灵活性。

public abstract class Creator
{
    public abstract Product FactoryMethod();
}

public class ConcreteCreator : Creator
{
    public override Product FactoryMethod()
    {
        return new ConcreteProduct();
    }
}
观察者模式 (Observer Pattern)

观察者模式定义了对象间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。这对于实现事件驱动系统非常有用。

public interface IObserver
{
    void Update(string message);
}

public class Subject
{
    private List<IObserver> _observers = new List<IObserver>();

    public void Attach(IObserver observer)
    {
        _observers.Add(observer);
    }

    public void NotifyObservers(string message)
    {
        foreach (var observer in _observers)
        {
            observer.Update(message);
        }
    }
}
装饰器模式 (Decorator Pattern)

装饰器模式允许动态地给对象添加职责,而不改变原有代码。通过组合而非继承的方式,可以灵活地扩展功能。

public abstract class Component
{
    public abstract void Operation();
}

public class ConcreteComponent : Component
{
    public override void Operation()
    {
        Console.WriteLine("ConcreteComponent Operation");
    }
}

public abstract class Decorator : Component
{
    protected Component _component;

    public Decorator(Component component)
    {
        _component = component;
    }

    public override void Operation()
    {
        if (_component != null)
        {
            _component.Operation();
        }
    }
}

public class ConcreteDecorator : Decorator
{
    public ConcreteDecorator(Component component) : base(component) { }

    public override void Operation()
    {
        base.Operation();
        AddedBehavior();
    }

    private void AddedBehavior()
    {
        Console.WriteLine("Added Behavior by ConcreteDecorator");
    }
}
结论

设计模式为解决特定类型的编程问题提供了行之有效的方案。通过学习和实践这些模式,开发者能够编写出更健壮、更具弹性的应用程序。C#作为一种强大的面向对象语言,非常适合用来实现各种设计模式。希望本文能激发您对设计模式的兴趣,并帮助您在未来的项目中加以运用。

参考资料

这篇文章涵盖了几个核心的设计模式及其C#实现,适合有一定基础的读者进一步提升技能。同时,也鼓励读者根据自己的需求探索更多模式和最佳实践。

标签:C#,void,component,优雅,class,Operation,设计模式,public
From: https://blog.csdn.net/2302_82029124/article/details/144918837

相关文章

  • Java 集合 Collection、List、Set
    一.Collection单列集合    1. Collection代表单列集合,每个元素(数据)只包含一个值    2.Collection集合特点        ①List系列集合:添加的元素是有序、可重复、有索引。            ArrayList、LinekdList:有......
  • DCGAN模型详解
    模型背景在深度学习领域迅速发展的背景下,生成对抗网络(GAN)作为一种革命性的生成模型应运而生。IanGoodfellow等人于2014年首次提出GAN概念,开创了生成模型的新纪元。这一创新源于对深度学习在图像生成方面潜力的探索,旨在解决非监督学习中的关键问题:如何让机器创造出看似真......
  • CF2053F Earnest Matrix Complement
    CF2053FEarnestMatrixComplement题意:多测每次给定\(n,m,k\),存在一个\(n\timesm\)的表格,其中\(a_{i,j}\in{[1,k]\\text{and}\-1}\)令\(c_{i,j}=\sum_{p=1}^m{[a_{i,p}=j]}\)最后\(V=\sum_{i=2}^n\sum_{j=1}^{n\timesm}c_{i-1,j}......
  • 使用Cursor + Qwen2.5 大模型 零经验研发微信小程序:自由构建个性化节拍器应用实战
    最近,小朋友开始学习小提琴,需要一个节拍器来帮助他练习。老牛同学下载了好几个节拍器应用,里面的广告实在是太多了,简直无从下手操作,就算老牛同学是慎之又慎,但还是中招,被运营商扣费。因此,老牛同学决定自己动手,定制一个专属的微信小程序节拍器。虽然老牛同学没有微信小程序的研发经验......
  • 04-c++类和对象(下)
    一、友元前面学习的类中,只能通过该类的公共方法访问私有数据。而如果将某个函数设置为类的友元,那么这个函数就可以直接访问该类的私有数据,破坏了类的封装性,只在某些特定的情况下使用。友元的分类:普通全局函数作为友元、类的某个成员函数作为友元、整个类作为友元。关键字:f......
  • 03-C++类和对象(中)
    一、初始化列表1.对象成员对象成员即一个类的对象作为另外一个类的成员。代码演示classA{private:inta;public:A(){a=0;cout<<"A的无参构造被调用"<<endl;}A(inta1){a=a1;cout<<"A......
  • 题解:AtCoder [ARC176D] Swap Permutation
    题意原题链接给定一个长度为\(n\)的排列\(p\),并执行以下操作\(m\)次:选择\(1\leqi<j\leqn\),交换\(p_i\)和\(p_j\)。定义一个序列\(p\)的权值为\(\sum_{i=1}^{n-1}|p_i-p_{i-1}|\)。求在\(\binom{n}{2}^m\)种可能的操作后,\(p\)的价值之和。答案对\(998244353\)......
  • 03-C++类和对象(上)
    一、类的概述1.类的引入类的封装:将数据和方法封装在一起,加以权限区分,用户只能通过公共方法访问私有数据。为什么要将数据和方法封装在一起呢,而且还要通过公共方法才能访问私有数据?C语言中数据和方法分开可能产生的问题://定义一个狗结构体structDog{charname[......
  • JavaScript 基础2
    js的运算符算数运算符+相加求和,如果用在字符串则是拼接-相减求差*相乘求积/相除求商%模除求余具体用法如下letnum=154letnum2=15document.write(num+num2)document.write(`<br>`)document.write(num-num2)document.write(`<br>`)document.write(num*num2)......
  • AtCoder Beginner Contest 386 补题
    E-MaximizeXOR题目大意给出\(n\)个数,要选\(k\)个使异或和最大。\(n\leq2\times10^5,k\leqn\)\(C_n^k\leq10^6\)思路由于那个组合数的性质,发现应该是直接深搜就可以的。可是发现T了。发现如果\(k\)很大那么还是不好处理。但是发现搜\(k\)个数和搜\(n-k\)个......