首页 > 编程语言 >C# 23种模式具体应用场景

C# 23种模式具体应用场景

时间:2024-12-06 16:44:32浏览次数:7  
标签:场景 Console string 23 C# void public new class

23种模式具体应用场景

整理23种设计模式的应用场景并提供完整具体的Demo是一个相当庞大的任务。为了确保每个模式的解释和示例都清晰易懂,我将逐步介绍每个设计模式,并提供相应的C#代码示例和中文注释。

1. 单例模式(Singleton Pattern)

应用场景

在一个Web应用中,我们可能需要一个全局的配置管理器来读取配置文件,并确保在整个应用生命周期中只有一个实例。

示例代码

using System;

public class ConfigurationManager
{
    private static ConfigurationManager _instance;
    private static readonly object _lock = new object();

    // 私有构造函数,防止外部实例化
    private ConfigurationManager()
    {
        // 读取配置文件
        Console.WriteLine("读取配置文件...");
    }

    public static ConfigurationManager Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new ConfigurationManager();
                    }
                }
            }
            return _instance;
        }
    }

    public string GetConfig(string key)
    {
        // 返回配置值
        return "配置值";
    }
}

class Program
{
    static void Main(string[] args)
    {
        ConfigurationManager configManager = ConfigurationManager.Instance;
        string configValue = configManager.GetConfig("SomeKey");
        Console.WriteLine(configValue);
    }
}

2. 工厂方法模式(Factory Method Pattern)

应用场景

在一个电商系统中,我们可能需要根据不同的支付方式(如支付宝、微信支付、信用卡支付)创建不同的支付处理对象。

示例代码

using System;

public abstract class Payment
{
    public abstract void Pay();
}

public class Alipay : Payment
{
    public override void Pay()
    {
        Console.WriteLine("使用支付宝支付");
    }
}

public class WeChatPay : Payment
{
    public override void Pay()
    {
        Console.WriteLine("使用微信支付");
    }
}

public abstract class PaymentFactory
{
    public abstract Payment CreatePayment();
}

public class AlipayFactory : PaymentFactory
{
    public override Payment CreatePayment()
    {
        return new Alipay();
    }
}

public class WeChatPayFactory : PaymentFactory
{
    public override Payment CreatePayment()
    {
        return new WeChatPay();
    }
}

class Program
{
    static void Main(string[] args)
    {
        PaymentFactory factory = new AlipayFactory();
        Payment payment = factory.CreatePayment();
        payment.Pay();

        factory = new WeChatPayFactory();
        payment = factory.CreatePayment();
        payment.Pay();
    }
}

3. 抽象工厂模式(Abstract Factory Pattern)

应用场景

在一个跨平台的GUI应用中,我们可能需要为不同的操作系统(如Windows、MacOS)创建不同的UI组件(如按钮、文本框)。

示例代码

using System;

public interface IButton
{
    void Render();
}

public interface ITextBox
{
    void Render();
}

public class WindowsButton : IButton
{
    public void Render()
    {
        Console.WriteLine("渲染Windows按钮");
    }
}

public class MacOSButton : IButton
{
    public void Render()
    {
        Console.WriteLine("渲染MacOS按钮");
    }
}

public class WindowsTextBox : ITextBox
{
    public void Render()
    {
        Console.WriteLine("渲染Windows文本框");
    }
}

public class MacOSTextBox : ITextBox
{
    public void Render()
    {
        Console.WriteLine("渲染MacOS文本框");
    }
}

public interface IGUIFactory
{
    IButton CreateButton();
    ITextBox CreateTextBox();
}

public class WindowsFactory : IGUIFactory
{
    public IButton CreateButton()
    {
        return new WindowsButton();
    }

    public ITextBox CreateTextBox()
    {
        return new WindowsTextBox();
    }
}

public class MacOSFactory : IGUIFactory
{
    public IButton CreateButton()
    {
        return new MacOSButton();
    }

    public ITextBox CreateTextBox()
    {
        return new MacOSTextBox();
    }
}

class Program
{
    static void Main(string[] args)
    {
        IGUIFactory factory = new WindowsFactory();
        IButton button = factory.CreateButton();
        ITextBox textBox = factory.CreateTextBox();
        button.Render();
        textBox.Render();

        factory = new MacOSFactory();
        button = factory.CreateButton();
        textBox = factory.CreateTextBox();
        button.Render();
        textBox.Render();
    }
}

4. 建造者模式(Builder Pattern)

应用场景

在一个复杂对象的创建过程中,例如创建一个包含多个部分的报告(标题、内容、页脚),我们可以使用建造者模式来一步一步构建这个对象。

示例代码

using System;

public class Report
{
    public string Title { get; set; }
    public string Content { get; set; }
    public string Footer { get; set; }

    public void Show()
    {
        Console.WriteLine($"标题: {Title}");
        Console.WriteLine($"内容: {Content}");
        Console.WriteLine($"页脚: {Footer}");
    }
}

public abstract class ReportBuilder
{
    protected Report report = new Report();

    public abstract void BuildTitle();
    public abstract void BuildContent();
    public abstract void BuildFooter();

    public Report GetReport()
    {
        return report;
    }
}

public class PDFReportBuilder : ReportBuilder
{
    public override void BuildTitle()
    {
        report.Title = "PDF 报告标题";
    }

    public override void BuildContent()
    {
        report.Content = "PDF 报告内容";
    }

    public override void BuildFooter()
    {
        report.Footer = "PDF 报告页脚";
    }
}

public class WordReportBuilder : ReportBuilder
{
    public override void BuildTitle()
    {
        report.Title = "Word 报告标题";
    }

    public override void BuildContent()
    {
        report.Content = "Word 报告内容";
    }

    public override void BuildFooter()
    {
        report.Footer = "Word 报告页脚";
    }
}

public class ReportDirector
{
    private ReportBuilder builder;

    public ReportDirector(ReportBuilder builder)
    {
        this.builder = builder;
    }

    public void Construct()
    {
        builder.BuildTitle();
        builder.BuildContent();
        builder.BuildFooter();
    }
}

class Program
{
    static void Main(string[] args)
    {
        ReportBuilder builder = new PDFReportBuilder();
        ReportDirector director = new ReportDirector(builder);
        director.Construct();
        Report report = builder.GetReport();
        report.Show();

        builder = new WordReportBuilder();
        director = new ReportDirector(builder);
        director.Construct();
        report = builder.GetReport();
        report.Show();
    }
}

5. 原型模式(Prototype Pattern)

应用场景

在一个图形编辑器中,我们可能需要复制图形对象(如圆形、矩形),并对其进行修改。使用原型模式可以方便地复制这些对象。

示例代码

using System;

public abstract class Shape
{
    public int X { get; set; }
    public int Y { get; set; }
    public string Color { get; set; }

    public abstract Shape Clone();
}

public class Circle : Shape
{
    public int Radius { get; set; }

    public override Shape Clone()
    {
        return (Shape)this.MemberwiseClone();
    }
}

public class Rectangle : Shape
{
    public int Width { get; set; }
    public int Height { get; set; }

    public override Shape Clone()
    {
        return (Shape)this.MemberwiseClone();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Circle circle = new Circle { X = 10, Y = 20, Color = "Red", Radius = 15 };
        Circle clonedCircle = (Circle)circle.Clone();
        Console.WriteLine($"克隆的圆形: X={clonedCircle.X}, Y={clonedCircle.Y}, Color={clonedCircle.Color}, Radius={clonedCircle.Radius}");

        Rectangle rectangle = new Rectangle { X = 30, Y = 40, Color = "Blue", Width = 50, Height = 60 };
        Rectangle clonedRectangle = (Rectangle)rectangle.Clone();
        Console.WriteLine($"克隆的矩形: X={clonedRectangle.X}, Y={clonedRectangle.Y}, Color={clonedRectangle.Color}, Width={clonedRectangle.Width}, Height={clonedRectangle.Height}");
    }
}

以上是前五种设计模式的应用场景和示例代码。由于篇幅限制,其他设计模式的示例可以在后续继续补充。如果你有特定的设计模式需要优先了解,请告诉我,我会优先提供相关示例。

6.适配器模式(Adapter Pattern)

应用场景:假设我们有一个旧的支付系统 OldPaymentSystem,它有一个方法 ProcessPayment。现在我们有一个新的支付系统 NewPaymentSystem,它有一个方法 MakePayment。我们希望在不修改旧系统的情况下使用新系统。

// 旧的支付系统
public class OldPaymentSystem
{
    public void ProcessPayment(string paymentDetails)
    {
        Console.WriteLine($"Processing payment using old system: {paymentDetails}");
    }
}

// 新的支付系统
public class NewPaymentSystem
{
    public void MakePayment(string paymentDetails)
    {
        Console.WriteLine($"Processing payment using new system: {paymentDetails}");
    }
}

// 适配器
public class PaymentAdapter : OldPaymentSystem
{
    private readonly NewPaymentSystem _newPaymentSystem;

    public PaymentAdapter(NewPaymentSystem newPaymentSystem)
    {
        _newPaymentSystem = newPaymentSystem;
    }

    public new void ProcessPayment(string paymentDetails)
    {
        _newPaymentSystem.MakePayment(paymentDetails);
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        OldPaymentSystem oldPaymentSystem = new PaymentAdapter(new NewPaymentSystem());
        oldPaymentSystem.ProcessPayment("100 USD");
    }
}

7. 装饰器模式(Decorator Pattern)

应用场景:假设我们有一个基本的 Coffee 类,并且我们希望动态地添加不同的配料(如牛奶、糖等)来装饰咖啡。

// 基本的咖啡接口
public interface ICoffee
{
    string GetDescription();
    double GetCost();
}

// 基本的咖啡实现
public class SimpleCoffee : ICoffee
{
    public string GetDescription()
    {
        return "Simple Coffee";
    }

    public double GetCost()
    {
        return 5.0;
    }
}

// 装饰器基类
public abstract class CoffeeDecorator : ICoffee
{
    protected ICoffee _coffee;

    public CoffeeDecorator(ICoffee coffee)
    {
        _coffee = coffee;
    }

    public virtual string GetDescription()
    {
        return _coffee.GetDescription();
    }

    public virtual double GetCost()
    {
        return _coffee.GetCost();
    }
}

// 牛奶装饰器
public class MilkDecorator : CoffeeDecorator
{
    public MilkDecorator(ICoffee coffee) : base(coffee) { }

    public override string GetDescription()
    {
        return _coffee.GetDescription() + ", Milk";
    }

    public override double GetCost()
    {
        return _coffee.GetCost() + 1.5;
    }
}

// 糖装饰器
public class SugarDecorator : CoffeeDecorator
{
    public SugarDecorator(ICoffee coffee) : base(coffee) { }

    public override string GetDescription()
    {
        return _coffee.GetDescription() + ", Sugar";
    }

    public override double GetCost()
    {
        return _coffee.GetCost() + 0.5;
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        ICoffee coffee = new SimpleCoffee();
        Console.WriteLine($"{coffee.GetDescription()} : ${coffee.GetCost()}");

        coffee = new MilkDecorator(coffee);
        Console.WriteLine($"{coffee.GetDescription()} : ${coffee.GetCost()}");

        coffee = new SugarDecorator(coffee);
        Console.WriteLine($"{coffee.GetDescription()} : ${coffee.GetCost()}");
    }
}

8. 观察者模式(Observer Pattern)

应用场景:假设我们有一个股票市场系统,当股票价格变化时,所有订阅者(如投资者)都会收到通知。

using System;
using System.Collections.Generic;

// 观察者接口
public interface IObserver
{
    void Update(string stockSymbol, double stockPrice);
}

// 被观察者接口
public interface ISubject
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

// 股票市场
public class StockMarket : ISubject
{
    private readonly List<IObserver> _observers;
    private readonly Dictionary<string, double> _stocks;

    public StockMarket()
    {
        _observers = new List<IObserver>();
        _stocks = new Dictionary<string, double>();
    }

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

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

    public void NotifyObservers()
    {
        foreach (var observer in _observers)
        {
            foreach (var stock in _stocks)
            {
                observer.Update(stock.Key, stock.Value);
            }
        }
    }

    public void SetStockPrice(string stockSymbol, double stockPrice)
    {
        _stocks[stockSymbol] = stockPrice;
        NotifyObservers();
    }
}

// 投资者
public class Investor : IObserver
{
    private readonly string _name;

    public Investor(string name)
    {
        _name = name;
    }

    public void Update(string stockSymbol, double stockPrice)
    {
        Console.WriteLine($"Investor {_name} notified. Stock: {stockSymbol}, New Price: {stockPrice}");
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        StockMarket stockMarket = new StockMarket();

        Investor investor1 = new Investor("Alice");
        Investor investor2 = new Investor("Bob");

        stockMarket.RegisterObserver(investor1);
        stockMarket.RegisterObserver(investor2);

        stockMarket.SetStockPrice("AAPL", 150.0);
        stockMarket.SetStockPrice("GOOGL", 2800.0);
    }
}

9. 策略模式(Strategy Pattern)

应用场景:假设我们有一个支付系统,可以使用不同的支付方式(如信用卡、PayPal、比特币等)。我们希望能够动态地选择支付方式。

// 支付策略接口
public interface IPaymentStrategy
{
    void Pay(double amount);
}

// 信用卡支付策略
public class CreditCardPayment : IPaymentStrategy
{
    public void Pay(double amount)
    {
        Console.WriteLine($"Paid {amount} using Credit Card.");
    }
}

// PayPal支付策略
public class PayPalPayment : IPaymentStrategy
{
    public void Pay(double amount)
    {
        Console.WriteLine($"Paid {amount} using PayPal.");
    }
}

// 比特币支付策略
public class BitcoinPayment : IPaymentStrategy
{
    public void Pay(double amount)
    {
        Console.WriteLine($"Paid {amount} using Bitcoin.");
    }
}

// 支付上下文
public class PaymentContext
{
    private IPaymentStrategy _paymentStrategy;

    public void SetPaymentStrategy(IPaymentStrategy paymentStrategy)
    {
        _paymentStrategy = paymentStrategy;
    }

    public void Pay(double amount)
    {
        _paymentStrategy.Pay(amount);
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        PaymentContext paymentContext = new PaymentContext();

        paymentContext.SetPaymentStrategy(new CreditCardPayment());
        paymentContext.Pay(100.0);

        paymentContext.SetPaymentStrategy(new PayPalPayment());
        paymentContext.Pay(200.0);

        paymentContext.SetPaymentStrategy(new BitcoinPayment());
        paymentContext.Pay(300.0);
    }
}

10. 责任链模式(Chain of Responsibility Pattern)

应用场景:假设我们有一个客户服务系统,客户的请求可以是简单的查询、投诉或退款请求。我们希望不同的请求由不同的处理器处理。

// 请求类
public class Request
{
    public string RequestType { get; set; }
    public string RequestContent { get; set; }
}

// 处理器抽象类
public abstract class Handler
{
    protected Handler _nextHandler;

    public void SetNextHandler(Handler nextHandler)
    {
        _nextHandler = nextHandler;
    }

    public abstract void HandleRequest(Request request);
}

// 查询处理器
public class QueryHandler : Handler
{
    public override void HandleRequest(Request request)
    {
        if (request.RequestType == "Query")
        {
            Console.WriteLine($"Handling query: {request.RequestContent}");
        }
        else if (_nextHandler != null)
        {
            _nextHandler.HandleRequest(request);
        }
    }
}

// 投诉处理器
public class ComplaintHandler : Handler
{
    public override void HandleRequest(Request request)
    {
        if (request.RequestType == "Complaint")
        {
            Console.WriteLine($"Handling complaint: {request.RequestContent}");
        }
        else if (_nextHandler != null)
        {
            _nextHandler.HandleRequest(request);
        }
    }
}

// 退款处理器
public class RefundHandler : Handler
{
    public override void HandleRequest(Request request)
    {
        if (request.RequestType == "Refund")
        {
            Console.WriteLine($"Handling refund: {request.RequestContent}");
        }
        else if (_nextHandler != null)
        {
            _nextHandler.HandleRequest(request);
        }
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        Handler queryHandler = new QueryHandler();
        Handler complaintHandler = new ComplaintHandler();
        Handler refundHandler = new RefundHandler();

        queryHandler.SetNextHandler(complaintHandler);
        complaintHandler.SetNextHandler(refundHandler);

        Request request1 = new Request { RequestType = "Query", RequestContent = "What is my account balance?" };
        Request request2 = new Request { RequestType = "Complaint", RequestContent = "I have a complaint about a transaction." };
        Request request3 = new Request { RequestType = "Refund", RequestContent = "I want a refund for my purchase." };

        queryHandler.HandleRequest(request1);
        queryHandler.HandleRequest(request2);
        queryHandler.HandleRequest(request3);
    }
}

11. 命令模式(Command Pattern)

应用场景:假设我们有一个智能家居系统,可以控制灯光、空调和电视。我们希望能够通过命令模式来实现这些设备的控制。

// 命令接口
public interface ICommand
{
    void Execute();
}

// 具体命令类
public class LightOnCommand : ICommand
{
    private readonly Light _light;

    public LightOnCommand(Light light)
    {
        _light = light;
    }

    public void Execute()
    {
        _light.On();
    }
}

public class LightOffCommand : ICommand
{
    private readonly Light _light;

    public LightOffCommand(Light light)
    {
        _light = light;
    }

    public void Execute()
    {
        _light.Off();
    }
}

// 接收者类
public class Light
{
    public void On()
    {
        Console.WriteLine("Light is On");
    }

    public void Off()
    {
        Console.WriteLine("Light is Off");
    }
}

// 调用者类
public class RemoteControl
{
    private ICommand _command;

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

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

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        Light livingRoomLight = new Light();
        ICommand lightOn = new LightOnCommand(livingRoomLight);
        ICommand lightOff = new LightOffCommand(livingRoomLight);

        RemoteControl remote = new RemoteControl();

        remote.SetCommand(lightOn);
        remote.PressButton();

        remote.SetCommand(lightOff);
        remote.PressButton();
    }
}

12. 迭代器模式(Iterator Pattern)

应用场景:假设我们有一个图书馆系统,图书馆有多个书架,每个书架上有多本书。我们希望能够遍历每个书架上的书。

using System.Collections;

// 书类
public class Book
{
    public string Title { get; set; }

    public Book(string title)
    {
        Title = title;
    }
}

// 书架类
public class Bookshelf : IEnumerable<Book>
{
    private readonly List<Book> _books = new List<Book>();

    public void AddBook(Book book)
    {
        _books.Add(book);
    }

    public IEnumerator<Book> GetEnumerator()
    {
        return _books.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        Bookshelf bookshelf = new Bookshelf();
        bookshelf.AddBook(new Book("Book 1"));
        bookshelf.AddBook(new Book("Book 2"));
        bookshelf.AddBook(new Book("Book 3"));

        foreach (var book in bookshelf)
        {
            Console.WriteLine(book.Title);
        }
    }
}

13. 中介者模式(Mediator Pattern)

应用场景:假设我们有一个聊天室系统,用户可以发送消息给其他用户。我们希望通过中介者模式来管理用户之间的通信。

using System.Collections.Generic;

// 中介者接口
public interface IChatRoomMediator
{
    void SendMessage(string message, User user);
    void AddUser(User user);
}

// 具体中介者类
public class ChatRoom : IChatRoomMediator
{
    private readonly List<User> _users = new List<User>();

    public void AddUser(User user)
    {
        _users.Add(user);
    }

    public void SendMessage(string message, User user)
    {
        foreach (var u in _users)
        {
            if (u != user)
            {
                u.Receive(message);
            }
        }
    }
}

// 用户类
public class User
{
    private readonly IChatRoomMediator _chatRoom;
    public string Name { get; }

    public User(string name, IChatRoomMediator chatRoom)
    {
        Name = name;
        _chatRoom = chatRoom;
    }

    public void Send(string message)
    {
        Console.WriteLine($"{Name} sends: {message}");
        _chatRoom.SendMessage(message, this);
    }

    public void Receive(string message)
    {
        Console.WriteLine($"{Name} receives: {message}");
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        IChatRoomMediator chatRoom = new ChatRoom();

        User user1 = new User("Alice", chatRoom);
        User user2 = new User("Bob", chatRoom);
        User user3 = new User("Charlie", chatRoom);

        chatRoom.AddUser(user1);
        chatRoom.AddUser(user2);
        chatRoom.AddUser(user3);

        user1.Send("Hello, everyone!");
        user2.Send("Hi, Alice!");
    }
}

14. 备忘录模式(Memento Pattern)

应用场景:假设我们有一个文本编辑器,用户可以输入文本并且可以撤销操作。我们希望通过备忘录模式来实现撤销功能。

// 备忘录类
public class Memento
{
    public string State { get; }

    public Memento(string state)
    {
        State = state;
    }
}

// 发起人类
public class TextEditor
{
    public string Text { get; set; }

    public Memento Save()
    {
        return new Memento(Text);
    }

    public void Restore(Memento memento)
    {
        Text = memento.State;
    }
}

// 管理者类
public class Caretaker
{
    private readonly Stack<Memento> _mementos = new Stack<Memento>();

    public void SaveState(TextEditor editor)
    {
        _mementos.Push(editor.Save());
    }

    public void Undo(TextEditor editor)
    {
        if (_mementos.Count > 0)
        {
            editor.Restore(_mementos.Pop());
        }
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        TextEditor editor = new TextEditor();
        Caretaker caretaker = new Caretaker();

        editor.Text = "Hello, World!";
        caretaker.SaveState(editor);

        editor.Text = "Hello, Design Patterns!";
        caretaker.SaveState(editor);

        editor.Text = "Hello, Memento!";
        Console.WriteLine($"Current Text: {editor.Text}");

        caretaker.Undo(editor);
        Console.WriteLine($"After Undo: {editor.Text}");

        caretaker.Undo(editor);
        Console.WriteLine($"After Undo: {editor.Text}");
    }
}

15. 代理模式(Proxy Pattern)

应用场景:在访问某些资源时需要进行权限控制或延迟加载。例如,访问一个远程服务时,可以使用代理模式来控制访问。

// 代理模式示例代码
using System;

namespace ProxyPattern
{
    // 抽象主题
    public interface ISubject
    {
        void Request();
    }

    // 真实主题
    public class RealSubject : ISubject
    {
        public void Request()
        {
            Console.WriteLine("真实主题的请求处理。");
        }
    }

    // 代理
    public class Proxy : ISubject
    {
        private RealSubject _realSubject;

        public void Request()
        {
            if (_realSubject == null)
            {
                _realSubject = new RealSubject();
            }
            Console.WriteLine("代理处理前的操作。");
            _realSubject.Request();
            Console.WriteLine("代理处理后的操作。");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ISubject proxy = new Proxy();
            proxy.Request();
        }
    }
}

16. 组合模式(Composite Pattern)

应用场景:用于表示对象的部分-整体层次结构。例如,文件系统中的文件和文件夹。

// 组合模式示例代码
using System;
using System.Collections.Generic;

namespace CompositePattern
{
    // 组件
    public abstract class Component
    {
        protected string name;

        public Component(string name)
        {
            this.name = name;
        }

        public abstract void Display(int depth);
    }

    // 叶子
    public class Leaf : Component
    {
        public Leaf(string name) : base(name) { }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
        }
    }

    // 组合
    public class Composite : Component
    {
        private List<Component> children = new List<Component>();

        public Composite(string name) : base(name) { }

        public void Add(Component component)
        {
            children.Add(component);
        }

        public void Remove(Component component)
        {
            children.Remove(component);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
            foreach (Component component in children)
            {
                component.Display(depth + 2);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Composite root = new Composite("root");
            root.Add(new Leaf("Leaf A"));
            root.Add(new Leaf("Leaf B"));

            Composite comp = new Composite("Composite X");
            comp.Add(new Leaf("Leaf XA"));
            comp.Add(new Leaf("Leaf XB"));

            root.Add(comp);
            root.Add(new Leaf("Leaf C"));

            Leaf leaf = new Leaf("Leaf D");
            root.Add(leaf);
            root.Remove(leaf);

            root.Display(1);
        }
    }
}

17. 享元模式(Flyweight Pattern)

应用场景:用于减少创建对象的数量,以减少内存占用和提高性能。例如,文本编辑器中的字符对象。

// 享元模式示例代码
using System;
using System.Collections.Generic;

namespace FlyweightPattern
{
    // 享元接口
    public interface IFlyweight
    {
        void Operation(int extrinsicState);
    }

    // 具体享元
    public class ConcreteFlyweight : IFlyweight
    {
        private string intrinsicState;

        public ConcreteFlyweight(string intrinsicState)
        {
            this.intrinsicState = intrinsicState;
        }

        public void Operation(int extrinsicState)
        {
            Console.WriteLine($"具体享元:内部状态 {intrinsicState},外部状态 {extrinsicState}");
        }
    }

    // 享元工厂
    public class FlyweightFactory
    {
        private Dictionary<string, IFlyweight> flyweights = new Dictionary<string, IFlyweight>();

        public IFlyweight GetFlyweight(string key)
        {
            if (!flyweights.ContainsKey(key))
            {
                flyweights[key] = new ConcreteFlyweight(key);
            }
            return flyweights[key];
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            FlyweightFactory factory = new FlyweightFactory();

            IFlyweight flyweight1 = factory.GetFlyweight("A");
            flyweight1.Operation(1);

            IFlyweight flyweight2 = factory.GetFlyweight("B");
            flyweight2.Operation(2);

            IFlyweight flyweight3 = factory.GetFlyweight("A");
            flyweight3.Operation(3);
        }
    }
}

18. 解释器模式(Interpreter Pattern)

应用场景:用于描述如何为语言定义一个文法,以及如何解析这个文法。例如,计算器程序中的表达式解析。

// 解释器模式示例代码
using System;
using System.Collections.Generic;

namespace InterpreterPattern
{
    // 抽象表达式
    public abstract class Expression
    {
        public abstract int Interpret(Dictionary<string, int> context);
    }

    // 终结符表达式
    public class NumberExpression : Expression
    {
        private int number;

        public NumberExpression(int number)
        {
            this.number = number;
        }

        public override int Interpret(Dictionary<string, int> context)
        {
            return number;
        }
    }

    // 非终结符表达式
    public class AddExpression : Expression
    {
        private Expression leftExpression;
        private Expression rightExpression;

        public AddExpression(Expression left, Expression right)
        {
            leftExpression = left;
            rightExpression = right;
        }

        public override int Interpret(Dictionary<string, int> context)
        {
            return leftExpression.Interpret(context) + rightExpression.Interpret(context);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, int> context = new Dictionary<string, int>();

            Expression expression = new AddExpression(new NumberExpression(5), new NumberExpression(10));
            int result = expression.Interpret(context);

            Console.WriteLine($"结果:{result}");
        }
    }
}

19. 访问者模式(Visitor Pattern)

应用场景:用于将操作分离到对象结构之外。例如,文件系统中的文件和文件夹可以接受不同的操作,如压缩、加密等。

// 访问者模式示例代码
using System;
using System.Collections.Generic;

namespace VisitorPattern
{
    // 访问者接口
    public interface IVisitor
    {
        void Visit(ElementA elementA);
        void Visit(ElementB elementB);
    }

    // 具体访问者
    public class ConcreteVisitor : IVisitor
    {
        public void Visit(ElementA elementA)
        {
            Console.WriteLine("访问元素A");
        }

        public void Visit(ElementB elementB)
        {
            Console.WriteLine("访问元素B");
        }
    }

    // 元素接口
    public abstract class Element
    {
        public abstract void Accept(IVisitor visitor);
    }

    // 具体元素A
    public class ElementA : Element
    {
        public override void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

    // 具体元素B
    public class ElementB : Element
    {
        public override void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Element> elements = new List<Element>
            {
                new ElementA(),
                new ElementB()
            };

            IVisitor visitor = new ConcreteVisitor();

            foreach (Element element in elements)
            {
                element.Accept(visitor);
            }
        }
    }
}

20. 桥接模式(Bridge Pattern)

应用场景:假设我们有一个图形绘制应用程序,支持不同的形状(如圆形和矩形)和不同的绘制API(如OpenGL和DirectX)。桥接模式可以帮助我们将形状和绘制API解耦,使得它们可以独立变化。

// 实现部分接口
public interface IDrawAPI
{
    void DrawCircle(int radius, int x, int y);
}

// 具体实现类
public class OpenGLAPI : IDrawAPI
{
    public void DrawCircle(int radius, int x, int y)
    {
        Console.WriteLine($"OpenGLAPI: Drawing Circle [radius: {radius}, x: {x}, y: {y}]");
    }
}

public class DirectXAPI : IDrawAPI
{
    public void DrawCircle(int radius, int x, int y)
    {
        Console.WriteLine($"DirectXAPI: Drawing Circle [radius: {radius}, x: {x}, y: {y}]");
    }
}

// 抽象部分
public abstract class Shape
{
    protected IDrawAPI drawAPI;

    protected Shape(IDrawAPI drawAPI)
    {
        this.drawAPI = drawAPI;
    }

    public abstract void Draw();
}

// 扩展抽象部分
public class Circle : Shape
{
    private int x, y, radius;

    public Circle(int x, int y, int radius, IDrawAPI drawAPI) : base(drawAPI)
    {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    public override void Draw()
    {
        drawAPI.DrawCircle(radius, x, y);
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        Shape redCircle = new Circle(100, 100, 10, new OpenGLAPI());
        Shape greenCircle = new Circle(100, 100, 10, new DirectXAPI());

        redCircle.Draw();
        greenCircle.Draw();
    }
}

21. 模板方法模式(Template Method Pattern)

应用场景:假设我们有一个数据处理应用程序,需要处理不同类型的数据(如CSV和XML)。模板方法模式可以帮助我们定义一个算法的骨架,并允许子类实现具体步骤。

// 抽象类
public abstract class DataProcessor
{
    // 模板方法
    public void ProcessData()
    {
        ReadData();
        Process();
        SaveData();
    }

    protected abstract void ReadData();
    protected abstract void Process();
    protected abstract void SaveData();
}

// 具体类
public class CSVDataProcessor : DataProcessor
{
    protected override void ReadData()
    {
        Console.WriteLine("Reading CSV Data");
    }

    protected override void Process()
    {
        Console.WriteLine("Processing CSV Data");
    }

    protected override void SaveData()
    {
        Console.WriteLine("Saving CSV Data");
    }
}

public class XMLDataProcessor : DataProcessor
{
    protected override void ReadData()
    {
        Console.WriteLine("Reading XML Data");
    }

    protected override void Process()
    {
        Console.WriteLine("Processing XML Data");
    }

    protected override void SaveData()
    {
        Console.WriteLine("Saving XML Data");
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        DataProcessor csvProcessor = new CSVDataProcessor();
        csvProcessor.ProcessData();

        DataProcessor xmlProcessor = new XMLDataProcessor();
        xmlProcessor.ProcessData();
    }
}

22. 状态模式(State Pattern)

应用场景:假设我们有一个订单处理系统,订单可以处于不同的状态(如新建、已支付、已发货、已完成)。状态模式可以帮助我们将状态相关的行为封装到不同的状态对象中。

// 状态接口
public interface IOrderState
{
    void Handle(OrderContext context);
}

// 具体状态类
public class NewOrderState : IOrderState
{
    public void Handle(OrderContext context)
    {
        Console.WriteLine("Order is in New State");
        context.SetState(new PaidOrderState());
    }
}

public class PaidOrderState : IOrderState
{
    public void Handle(OrderContext context)
    {
        Console.WriteLine("Order is in Paid State");
        context.SetState(new ShippedOrderState());
    }
}

public class ShippedOrderState : IOrderState
{
    public void Handle(OrderContext context)
    {
        Console.WriteLine("Order is in Shipped State");
        context.SetState(new CompletedOrderState());
    }
}

public class CompletedOrderState : IOrderState
{
    public void Handle(OrderContext context)
    {
        Console.WriteLine("Order is in Completed State");
    }
}

// 上下文类
public class OrderContext
{
    private IOrderState state;

    public OrderContext()
    {
        state = new NewOrderState();
    }

    public void SetState(IOrderState state)
    {
        this.state = state;
    }

    public void Request()
    {
        state.Handle(this);
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        OrderContext order = new OrderContext();
        order.Request();
        order.Request();
        order.Request();
        order.Request();
    }
}

23. 迭代器模式(Iterator Pattern)

应用场景:假设我们有一个图书馆系统,需要遍历不同类型的集合(如书籍集合、杂志集合)。迭代器模式可以帮助我们提供一种统一的方式来遍历这些集合。

// 迭代器接口
public interface IIterator
{
    bool HasNext();
    object Next();
}

// 聚合接口
public interface IAggregate
{
    IIterator CreateIterator();
}

// 具体聚合类
public class BookCollection : IAggregate
{
    private List<string> books = new List<string>();

    public void AddBook(string book)
    {
        books.Add(book);
    }

    public IIterator CreateIterator()
    {
        return new BookIterator(this);
    }

    public int Count
    {
        get { return books.Count; }
    }

    public string this[int index]
    {
        get { return books[index]; }
    }
}

// 具体迭代器类
public class BookIterator : IIterator
{
    private BookCollection collection;
    private int currentIndex = 0;

    public BookIterator(BookCollection collection)
    {
        this.collection = collection;
    }

    public bool HasNext()
    {
        return currentIndex < collection.Count;
    }

    public object Next()
    {
        return collection[currentIndex++];
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        BookCollection books = new BookCollection();
        books.AddBook("Book 1");
        books.AddBook("Book 2");
        books.AddBook("Book 3");

        IIterator iterator = books.CreateIterator();
        while (iterator.HasNext())
        {
            string book = (string)iterator.Next();
            Console.WriteLine(book);
        }
    }
}

标签:场景,Console,string,23,C#,void,public,new,class
From: https://www.cnblogs.com/firespeed/p/18591080

相关文章

  • MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门
    MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门最近数据出现了两次写入异常报错如下:org.springframework,jdbc.UncategorizedsQlException:PreparedstatementCallback;uncategzed50LExcention[sql语句]TheMysOlserverisrunningwiththe--read-onlyoption......
  • object is not an instance of declaring class
    测试反射的时候报错了代码如下packageorg.example.provider.domain;importlombok.Data;@DatapublicclassUser{publicintuserId;publicStringuserName;}publicstaticvoidmain(String[]args)throwsClassNotFoundException,NoSuchMethodExcep......
  • commonjs exports require module 参数
    functionrequire(modulePath){//根据传递的模块路径获取模块idvarmoduleId=getModuleId(modulePath);if(caches[moduleId]){returncaches[moduleId];}function_require(exports,require,module,__filename,__dirname){//目标......
  • "context deadline exceeded" 错误
    在Go语言中,context包提供了一种跨API和进程边界传递请求作用域值、取消信号以及超时信号的方式。使用context可以帮助更好地控制goroutine,避免goroutine泄漏等问题。出现“contextdeadlineexceeded”错误通常是因为在请求上下文中设置了超时时间,但请求在超时时间内......
  • 什么是前后端分离应用(Full-stack Separation),想当然就会理解错
    前后端分离应用指的是将应用的前端部分(用户界面与交互逻辑)和后端部分(业务逻辑、数据处理、服务器响应)拆分成独立的模块,各自通过API进行通信。这种架构设计的目的是提高开发效率、增强可扩展性和灵活性,使前端和后端能够独立开发、部署和维护。一、传统的前后端耦合应用vs......
  • 2024版最新CTF —— 网络安全大赛_ctf网络安全大赛,收藏这一篇就够了
    前言随着大数据、人工智能的发展,人们步入了新的时代,逐渐走上科技的巅峰。⚔科技是一把双刃剑,网络安全不容忽视,人们的隐私在大数据面前暴露无遗,账户被盗、资金损失、网络诈骗、隐私泄露,种种迹象表明,随着互联网的发展,网络安全需要引起人们的重视。互联网安全从其本质上来讲......
  • 10个程序员可以接私活的平台(非常详细)零基础入门到精通,收藏这篇就够了_csd在哪里接单
    私活接的好收入不比上班少,一些同学靠接私活月收入也上万甚至几万了。今天老韩来分享一下有哪些接私活的网站和平台,转发收藏以后备用我们先来聊聊什么样的私活不能接。。1、没有第三方担保的个人对个人的尽量不要接,双方都没保障,出了问题很大的可能撕破脸皮不了了之。2、......
  • ruoyi-nbcio为安全起见actuator为仅暴露health端点
    actuator一直是个安全的大问题,所以以后还是要尽量避免使用或小心使用1、目前先仅暴露health端点的方式来处理,一位网友提醒的安全问题2、否则可以通过/actuator/env进行访问,有很多信息回泄漏,大家注意一下。3、同时通过下面方式关闭也不大合适,因为本身系统有监控需要打开,而......
  • UNICODE编码特殊符号
    平时编程中会用到各种各样的符号,有时不想去找图片,一些简单的符号,可以直接通过Unicode字符来获取: RoundButton{text:"\u2713"//UnicodeCharacter'CHECKMARK'onClicked:textArea.readOnly=true}以下是常用的Unicode特殊符号,建议收藏:⇠  箭头......
  • RCE漏洞及绕过技巧:从基础到高级实战攻略
    文章目录常见漏洞执行函数:1.系统命令执行函数2.代码执行函数命令拼接符读取文件命令绕过:空格过滤绕过关键字绕过长度过滤绕过无参数命令执行绕过无字母数字绕过利用%0A截断利用回溯绕过利用create_function()代码注入无回显RCE1.反弹shell2.dnslog外带数据法3.msf反向回......