C# 中的设计模式,如何使用常见的设计模式实现程序功能?

设计模式

设计模式是指在软件设计中,经过总结、提炼和归纳得到的、具有普遍适用性的面向对象设计经验的总结。设计模式不是一种具体的技术,而是一种被广泛使用的编程思想,它们提供了一种经过验证的解决方案,是解决问题的一种思路,可以帮助开发人员解决特定类型的问题。

设计模式可以帮助我们解决软件设计中的一些常见问题,比如对象的创建与销毁、对象之间的协作、类的继承与复用、算法与对象的分离等。在实际开发中,设计模式可以提高代码的可维护性、可扩展性和可重用性,使代码更加优雅、简洁、清晰。

常见的设计模式包括:

  1. 创建型模式:用于描述对象的创建过程,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、原型模式和建造者模式。
  2. 结构型模式:用于描述类或对象之间的组合方式,包括适配器模式、桥接模式、装饰者模式、组合模式、外观模式和享元模式。
  3. 行为型模式:用于描述对象之间的通信方式,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

除了上述常见的设计模式,还有一些其他的设计模式,如并发模式、面向切面编程(AOP)模式、领域模型模式等。在实际开发中,需要根据实际情况选择合适的设计模式来解决具体问题,而不是一味地追求使用设计模式。

常见的设计模式

下面介绍一些常见的设计模式以及如何使用它们来实现程序功能:

  1. 工厂模式

    工厂模式是一种创建型模式,它定义了一种用于创建对象的接口,但是允许子类决定要实例化的类是哪一个。工厂模式可以帮助我们在不暴露对象创建逻辑的情况下,将对象的创建与使用分离。

    工厂模式是一种常见的设计模式,它的主要作用是创建对象。在 C# 中,我们通常使用静态工厂方法来创建对象。下面是一个简单的示例代码:

    // 定义一个接口
    public interface IAnimal
    {
        void MakeSound();
    }
    
    // 实现两个类
    public class Dog : IAnimal
    {
        public void MakeSound()
        {
            Console.WriteLine("汪汪汪");
        }
    }
    
    public class Cat : IAnimal
    {
        public void MakeSound()
        {
            Console.WriteLine("喵喵喵");
        }
    }
    
    // 定义一个工厂类
    public static class AnimalFactory
    {
        public static IAnimal CreateAnimal(string type)
        {
            switch (type.ToLower())
            {
                case "dog":
                    return new Dog();
                case "cat":
                    return new Cat();
                default:
                    throw new ArgumentException("无效的类型");
            }
        }
    }
    
    // 使用工厂类创建对象
    IAnimal dog = AnimalFactory.CreateAnimal("dog");
    IAnimal cat = AnimalFactory.CreateAnimal("cat");
    dog.MakeSound(); // 输出:汪汪汪
    cat.MakeSound(); // 输出:喵喵喵
    
  2. 单例模式                                                                                                                                                                                                                                                                                    单例模式是一种非常常见的设计模式,它的主要作用是确保一个类只有一个实例,并提供一个全局访问点。C#中实现单例模式的常见方式是使用静态变量和私有构造函数,确保只有一个实例被创建,并提供一个全局访问点。                                                                               下面是一个简单的示例代码:
    public class Singleton
    {
        private static Singleton _instance;
    
        // 私有构造函数
        private Singleton()
        {
            // 初始化操作...
        }
    
        public static Singleton Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
                return _instance;
            }
        }
    
        public void SayHello()
        {
            Console.WriteLine("Hello, World!");
        }
    }
    
    // 使用单例类
    Singleton singleton = Singleton.Instance;
    singleton.SayHello(); // 输出:Hello, World!
    

    在这个实现中,Singleton类有一个私有的构造函数,防止外部直接创建实例。同时,它有一个私有的静态变量instance,用于保存唯一的实例。Instance是一个公共的静态属性,当第一次调用它时,它会创建一个新的实例,以后的调用都会返回同一个实例。

    需要注意的是,这种实现方式并不是线程安全的。如果在多线程环境下使用,可能会导致多个线程同时调用Instance方法,从而创建多个实例。为了解决这个问题,可以使用锁或者其他线程同步机制。

  3. 观察者模式                                                                                                                                                                                                                                                                               观察者模式是一种常见的设计模式,它的主要作用是定义对象间的一种一对多的依赖关系,使得每当一个对象状态改变时,其所有依赖者都会收到通知并自动更新。下面是一个简单的 示例代码:                                                                      
    // 定义观察者接口
    public interface IObserver
    {
        void Update(string message);
    }
    
    // 定义被观察者类
    public class Subject
    {
        private List _observers = new List();
    
        public void Attach(IObserver observer)
        {
            _observers.Add(observer);
        }
    
        public void Detach(IObserver observer)
        {
            _observers.Remove(observer);
        }
    
        public void Notify(string message)
        {
            foreach (var observer in _observers)
            {
                observer.Update(message);
            }
        }
    }
    
    

        4.下面介绍另一个常见的设计模式:装饰器模式(Decorator Pattern)。

        装饰器模式是一种结构型模式,它允许你在不改变对象自身的基础上,动态地给对象添加功 能。装饰器模式相比生成子类更为灵活,这样可以增加新的行为而不影响其他对象,同时也不需要使用大量的条件语句来进行选择。

        在 C# 中,装饰器模式通常通过实现同一个基类或接口来实现。下面是一个简单的示例代码,展示了如何使用装饰器模式来扩展一个已有的类的功能:

// 定义一个接口
public interface ICar
{
    void Run();
}

// 实现接口的基本类
public class Car : ICar
{
    public void Run()
    {
        Console.WriteLine("This is a car.");
    }
}

// 定义装饰器的抽象类
public abstract class Decorator : ICar
{
    protected ICar _car;

    public Decorator(ICar car)
    {
        _car = car;
    }

    public virtual void Run()
    {
        _car.Run();
    }
}

// 具体的装饰器实现
public class SportCar : Decorator
{
    public SportCar(ICar car) : base(car)
    {
    }

    public override void Run()
    {
        base.Run();
        Console.WriteLine("This is a sport car.");
    }
}

public class LuxuryCar : Decorator
{
    public LuxuryCar(ICar car) : base(car)
    {
    }

    public override void Run()
    {
        base.Run();
        Console.WriteLine("This is a luxury car.");
    }
}

// 客户端代码
static void Main(string[] args)
{
    ICar car = new Car();
    car.Run();

    ICar sportCar = new SportCar(car);
    sportCar.Run();

    ICar luxuryCar = new LuxuryCar(car);
    luxuryCar.Run();

    ICar luxurySportCar = new LuxuryCar(new SportCar(car));
    luxurySportCar.Run();
}

在这个示例中,我们首先定义了一个接口 ICar,表示一个基本的车辆类。然后我们实现了 Car 类,它是一个基本的车辆类。接下来我们定义了一个抽象类 Decorator,它实现了 ICar 接口,并包含一个 _car 成员变量,表示被装饰的对象。DecoratorRun 方法调用 _carRun 方法。然后我们定义了两个具体的装饰器 SportCarLuxuryCar,它们分别增加了车辆的运动和奢华的功能。最后,我们在客户端代码中分别创建了一个基本车辆、一个运动车辆、一个奢华车辆和一个豪华运动车辆,并分别调用它们的 Run 方法来观察输出结果。

这里我们使用抽象类来实现装饰器模式,也可以使用接口来实现。下面是使用接口实现的代码示例:

interface ICar
{
    void Drive();
}

class Car : ICar
{
    public void Drive()
    {
        Console.WriteLine("Drive a car");
    }
}

abstract class CarDecorator : ICar
{
    protected ICar _car;

    public CarDecorator(ICar car)
    {
        _car = car;
    }

    public virtual void Drive()
    {
        _car.Drive();
    }
}

class LuxuryCar : CarDecorator
{
    public LuxuryCar(ICar car) : base(car)
    {
    }

    public override void Drive()
    {
        base.Drive();
        Console.WriteLine("Driving a luxury car");
    }
}

class SportsCar : CarDecorator
{
    public SportsCar(ICar car) : base(car)
    {
    }

    public override void Drive()
    {
        base.Drive();
        Console.WriteLine("Driving a sports car");
    }
}

在上面的代码中,我们定义了一个 ICar 接口和一个 Car 类来实现基本的汽车功能。然后定义了一个抽象的装饰器类 CarDecorator,它包含了一个 _car 成员变量来引用被装饰的汽车对象,并实现了 ICar 接口。接下来,我们定义了两个具体的装饰器类 LuxuryCarSportsCar,它们都继承自 CarDecorator,并且在 Drive 方法中调用了基类的 Drive 方法来实现汽车的基本功能,然后添加了额外的功能,分别是驾驶豪华车和驾驶跑车。

下面是使用装饰器模式的示例代码:

static void Main(string[] args)
{
    ICar car = new Car();
    car.Drive(); // Drive a car

    ICar luxuryCar = new LuxuryCar(car);
    luxuryCar.Drive(); // Drive a car; Driving a luxury car

    ICar sportsCar = new SportsCar(car);
    sportsCar.Drive(); // Drive a car; Driving a sports car

    ICar luxurySportsCar = new LuxuryCar(new SportsCar(car));
    luxurySportsCar.Drive(); // Drive a car; Driving a sports car; Driving a luxury car
}

在上面的代码中,我们首先创建了一个基本的汽车对象 car,然后用 LuxuryCarSportsCar 装饰它,最后用 LuxuryCar 装饰了一个 SportsCar 装饰过的 car 对象。输出结果如注释所示。

装饰器模式的优点是可以动态地添加或移除对象的功能,不需要修改原有的代码,避免了继承关系的静态限制,使得代码更加灵活和可扩展。

你可能感兴趣的:(C#笔记,c#,设计模式,单例模式)