范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

用C详细讲解23种设计模式

  工厂方法模式(Factory Method Pattern)
  工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把对象的实例化推迟到子类。
  代码示例: csharpCopy codepublic interface IProduct {     void Operation(); }  public class ProductA : IProduct {     public void Operation()     {         Console.WriteLine("Product A operation");     } }  public class ProductB : IProduct {     public void Operation()     {         Console.WriteLine("Product B operation");     } }  public abstract class Creator {     public abstract IProduct FactoryMethod(); }  public class ConcreteCreatorA : Creator {     public override IProduct FactoryMethod()     {         return new ProductA();     } }  public class ConcreteCreatorB : Creator {     public override IProduct FactoryMethod()     {         return new ProductB();     } } 抽象工厂模式(Abstract Factory Pattern)
  抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
  代码示例: csharpCopy codepublic interface IProductA {     void OperationA(); }  public interface IProductB {     void OperationB(); }  public class ProductA1 : IProductA {     public void OperationA()     {         Console.WriteLine("Product A1 operation");     } }  public class ProductA2 : IProductA {     public void OperationA()     {         Console.WriteLine("Product A2 operation");     } }  public class ProductB1 : IProductB {     public void OperationB()     {         Console.WriteLine("Product B1 operation");     } }  public class ProductB2 : IProductB {     public void OperationB()     {         Console.WriteLine("Product B2 operation");     } }  public interface IAbstractFactory {     IProductA CreateProductA();     IProductB CreateProductB(); }  public class ConcreteFactory1 : IAbstractFactory {     public IProductA CreateProductA()     {         return new ProductA1();     }      public IProductB CreateProductB()     {         return new ProductB1();     } }  public class ConcreteFactory2 : IAbstractFactory {     public IProductA CreateProductA()     {         return new ProductA2();     }      public IProductB CreateProductB()     {         return new ProductB2();     } } 单例模式(Singleton Pattern)
  单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。
  代码示例: csharpCopy codepublic sealed class Singleton {     private static Singleton instance = null;      private Singleton() { }      public static Singleton Instance     {         get         {             if (instance == null)             {                 instance = new Singleton();             }              return instance;         }     } } 建造者模式(Builder Pattern)
  建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程和它的表示分离,使得同样的构建过程可以创建不同的表示。
  代码示例: csharpCopy codepublic class Product {     public string PartA { get; set; }     public string PartB { get; set; }     public string PartC { get; set; }      public override string ToString()     {         return #34;{PartA}, {PartB}, {PartC}";     } }  public interface IBuilder {     void BuildPartA();     void BuildPartB();     void BuildPartC();     Product GetResult(); }  public class ConcreteBuilder : IBuilder {     private Product product = new Product();      public void BuildPartA()     {         product.PartA = "Part A";     }      public void BuildPartB()     {         product.PartB = "Part B";     }      public void BuildPartC()     {         product.PartC = "Part C";     }      public Product GetResult()     {         return product;     } }  public class Director {     private IBuilder builder;      public Director(IBuilder builder)     {         this.builder = builder;     }      public void Construct()     {         builder.BuildPartA();         builder.BuildPartB();         builder.BuildPartC();     } } 原型模式(Prototype Pattern)
  原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化的方式。
  代码示例: csharpCopy codepublic class Prototype : ICloneable {     public string Value { get; set; }      public object Clone()     {         return MemberwiseClone();     } } 适配器模式(Adapter Pattern)
  适配器模式是一种结构型设计模式,它可以将一种类的接口转换成客户端希望的另一种接口。适配器模式允许接口不兼容的类能够合作。
  代码示例: csharpCopy codepublic interface ITarget {     void Request(); }  public class Adaptee {     public void SpecificRequest()     {         Console.WriteLine("Adaptee specific request");     } }  public class Adapter : ITarget {     private readonly Adaptee adaptee;      public Adapter(Adaptee adaptee)     {         this.adaptee = adaptee;     }      public void Request()     {         adaptee.SpecificRequest();     } } 桥接模式(Bridge Pattern)
  桥接模式是一种结构型设计模式,它可以将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。
  代码示例: csharpCopy codepublic interface IImplementor {     void OperationImp(); }  public class ConcreteImplementorA : IImplementor {     public void OperationImp()     {         Console.WriteLine("ConcreteImplementorA OperationImp");     } }  public class ConcreteImplementorB : IImplementor {     public void OperationImp()     {         Console.WriteLine("ConcreteImplementorB OperationImp");     } }  public abstract class Abstraction {     protected IImplementor implementor;      protected Abstraction(IImplementor implementor)     {         this.implementor = implementor;     }      public abstract void Operation(); }  public class RefinedAbstraction : Abstraction {     public RefinedAbstraction(IImplementor implementor) : base(implementor)     {     }      public override void Operation()     {         implementor.OperationImp();     } } 组合模式(Composite Pattern)
  组合模式是一种结构型设计模式,它允许将对象组合成树形结构来表现整体-部分关系。组合能让客户端统一处理单个对象和对象组合。
  代码示例: csharpCopy codepublic abstract class Component {     protected readonly string name;      public Component(string name)     {         this.name = name;     }      public abstract void Operation(); }  public class Leaf : Component {     public Leaf(string name) : base(name)     {     }      public override void Operation()     {         Console.WriteLine(#34;Leaf {name} Operation");     } }  public class Composite : Component {     private readonly List children = new List();      public Composite(string name) : base(name)     {     }      public override void Operation()     {         Console.WriteLine(#34;Composite {name} Operation");          foreach (var child in children)         {             child.Operation();         }     }      public void Add(Component component)     {         children.Add(component);     }      public void Remove(Component component)     {         children.Remove(component);     } } 桥接模式(Bridge Pattern)
  桥接模式是一种结构型设计模式,它将抽象与实现分离,以便它们可以独立地进行变化。
  代码示例: csharpCopy codepublic interface IImplementor {     void OperationImp(); }  public class ConcreteImplementorA : IImplementor {     public void OperationImp()     {         Console.WriteLine("ConcreteImplementorA OperationImp");     } }  public class ConcreteImplementorB : IImplementor {     public void OperationImp()     {         Console.WriteLine("ConcreteImplementorB OperationImp");     } }  public abstract class Abstraction {     protected IImplementor implementor;      public Abstraction(IImplementor implementor)     {         this.implementor = implementor;     }      public abstract void Operation(); }  public class RefinedAbstraction : Abstraction {     public RefinedAbstraction(IImplementor implementor) : base(implementor)     {     }      public override void Operation()     {         implementor.OperationImp();     } } 外观模式(Facade Pattern)
  外观模式是一种结构型设计模式,它为复杂的子系统提供简单的接口,从而使子系统更易于使用。
  代码示例: csharpCopy codepublic class SubsystemA {     public void OperationA()     {         Console.WriteLine("SubsystemA OperationA");     } }  public class SubsystemB {     public void OperationB()     {         Console.WriteLine("SubsystemB OperationB");     } }  public class Facade {     private readonly SubsystemA subsystemA;     private readonly SubsystemB subsystemB;      public Facade(SubsystemA subsystemA, SubsystemB subsystemB)     {         this.subsystemA = subsystemA;         this.subsystemB = subsystemB;     }      public void Operation()     {         subsystemA.OperationA();         subsystemB.OperationB();     } } 享元模式(Flyweight Pattern)
  享元模式是一种结构型设计模式,它通过共享尽可能多的数据来最小化内存使用和计算开销。享元模式适用于需要大量对象的情况,同时又要求对象能够轻量化。
  代码示例: csharpCopy codepublic class FlyweightFactory {     private readonly Dictionary flyweights = new Dictionary();      public Flyweight GetFlyweight(char key)     {         if (!flyweights.TryGetValue(key, out var flyweight))         {             flyweight = new ConcreteFlyweight(key);             flyweights[key] = flyweight;         }          return flyweight;     } }  public abstract class Flyweight {     public abstract void Operation(); }  public class ConcreteFlyweight : Flyweight {     private readonly char intrinsicState;      public ConcreteFlyweight(char intrinsicState)     {         this.intrinsicState = intrinsicState;     }      public override void Operation()     {         Console.WriteLine(#34;ConcreteFlyweight {intrinsicState} Operation");     } }  public class UnsharedConcreteFlyweight : Flyweight {     private readonly string extrinsicState;      public UnsharedConcreteFlyweight(string extrinsicState)     {         this.extrinsicState = extrinsicState;     }      public override void Operation()     {         Console.WriteLine(#34;UnsharedConcreteFlyweight {extrinsicState} Operation");     } } `` 组合模式(Composite Pattern)
  组合模式是一种结构型设计模式,允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们。
  适用场景:
  1.当你想表示对象的部分-整体层次结构时。
  2.当你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时。
  组合模式中的关键类: Component(组件):是组合中的对象声明接口,在适当情况下,实现所有类共有的接口默认行为。声明一个接口用于访问和管理 Component 子部件。 Leaf(叶子):在组合中表示子节点对象,叶子节点没有子节点。 Composite(容器):定义有枝节点行为,用来存储子部件,在 Component 接口中实现与子部件有关的操作,比如增加 Add 和删除 Remove。
  代码示例:
  下面是一个组合模式的示例,我们以一个目录结构为例来实现组合模式。目录中可以包含文件和文件夹,文件夹中又可以包含文件和文件夹。 csharpCopy code// 抽象构件 public abstract class Component {     protected string name;      public Component(string name)     {         this.name = name;     }      public abstract void Add(Component c);     public abstract void Remove(Component c);     public abstract void Display(int depth); }  // 叶子节点 public class Leaf : Component {     public Leaf(string name) : base(name) { }      public override void Add(Component c)     {         Console.WriteLine("不能向叶子节点添加节点");     }      public override void Remove(Component c)     {         Console.WriteLine("不能从叶子节点移除节点");     }      public override void Display(int depth)     {         Console.WriteLine(new string("-", depth) + name);     } }  // 容器节点 public class Composite : Component {     private List children = new List();      public Composite(string name) : base(name) { }      public override void Add(Component c)     {         children.Add(c);     }      public override void Remove(Component c)     {         children.Remove(c);     }      public override void Display(int depth)     {         Console.WriteLine(new string("-", depth) + name);          foreach (Component component in children)         {             component.Display(depth + 2);         }     } }  // 客户端代码 class Client {     static void Main(string[] args)     {         Composite root = new Composite("C:");         Composite windows = new Composite("Windows");         Composite programFiles = new Composite("Program Files");         Leaf file1 = new Leaf("a.txt");         Leaf file2 = new Leaf("b.txt");         Leaf file3 = new Leaf("c.txt");          root.Add(windows);         root.Add(programFiles);         windows.Add(file1);         windows.Add(file2);         programFiles.Add(file3);          root.Display(0);          Console.ReadKey();     } } Proxy(代理模式)
  代理模式为其他对象提供一种代理以控制对这个对象的访问。代理类与实际类具有相同的接口,这样就可以使用代理来代替实际类,使得在不改变原始代码的情况下增加了一些额外的功能。常用的代理模式有远程代理、虚拟代理、保护代理、缓存代理等。
  代码示例: csharpCopy code// 实际类 public class RealSubject : ISubject {     public void Request()     {         Console.WriteLine("RealSubject: Handling Request.");     } }  // 代理类 public class Proxy : ISubject {     private readonly RealSubject _realSubject;      public Proxy(RealSubject realSubject)     {         _realSubject = realSubject;     }      public void Request()     {         if (CheckAccess())         {             _realSubject.Request();              LogAccess();         }     }      private bool CheckAccess()     {         Console.WriteLine("Proxy: Checking access prior to firing a real request.");          return true;     }      private void LogAccess()     {         Console.WriteLine("Proxy: Logging the time of request.");     } }  // 接口类 public interface ISubject {     void Request(); }  // 使用代理 static void Main(string[] args) {     var realSubject = new RealSubject();     var proxy = new Proxy(realSubject);      proxy.Request(); } Command(命令模式)
  命令模式是一种行为型模式,它通过将请求封装为一个对象来实现请求的发送者和接收者之间的解耦。命令对象包含了要执行的操作以及其相关的数据,可以把命令对象看成是一个操作的载体。常用的命令模式有简单命令、复杂命令、队列请求等。
  代码示例: csharpCopy code// 命令接口 public interface ICommand {     void Execute(); }  // 具体命令 public class ConcreteCommand : ICommand {     private readonly Receiver _receiver;      public ConcreteCommand(Receiver receiver)     {         _receiver = receiver;     }      public void Execute()     {         _receiver.Action();     } }  // 接收者 public class Receiver {     public void Action()     {         Console.WriteLine("Receiver: Action.");     } }  // 发送者 public class Invoker {     private ICommand _command;      public void SetCommand(ICommand command)     {         _command = command;     }      public void ExecuteCommand()     {         _command.Execute();     } }  // 使用命令模式 static void Main(string[] args) {     var receiver = new Receiver();     var command = new ConcreteCommand(receiver);     var invoker = new Invoker();      invoker.SetCommand(command);     invoker.ExecuteCommand(); } 责任链模式(Chain of Responsibility Pattern)
  责任链模式是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理为止。
  在责任链模式中,每个处理器都只关心它自己能够处理的请求,并把它转发给下一个处理器。这样,请求者与处理器之间的耦合就被解除了,可以动态地改变请求的处理顺序或者增加/删除处理器。
  代码示例:
  下面是一个简单的例子,用来演示使用责任链模式实现不同等级的员工申请加薪请求的处理: csharpCopy codeabstract class Approver {     protected Approver successor;      public void SetSuccessor(Approver successor)     {         this.successor = successor;     }      public abstract void ProcessRequest(Request request); }  class Manager : Approver {     public override void ProcessRequest(Request request)     {         if (request.Type == RequestType.RaiseSalary && request.Amount <= 500)         {             Console.WriteLine(#34;Manager approved the request for raise of amount {request.Amount}");         }         else if (successor != null)         {             successor.ProcessRequest(request);         }     } }  class DepartmentHead : Approver {     public override void ProcessRequest(Request request)     {         if (request.Type == RequestType.RaiseSalary && request.Amount <= 1000)         {             Console.WriteLine(#34;Department head approved the request for raise of amount {request.Amount}");         }         else if (successor != null)         {             successor.ProcessRequest(request);         }     } }  class CEO : Approver {     public override void ProcessRequest(Request request)     {         if (request.Type == RequestType.RaiseSalary && request.Amount <= 5000)         {             Console.WriteLine(#34;CEO approved the request for raise of amount {request.Amount}");         }         else         {             Console.WriteLine(#34;The request for raise of amount {request.Amount} cannot be approved by anyone.");         }     } }  class Request {     public RequestType Type { get; set; }     public int Amount { get; set; } }  enum RequestType {     RaiseSalary }  static void Main(string[] args) {     Manager manager = new Manager();     DepartmentHead departmentHead = new DepartmentHead();     CEO ceo = new CEO();      manager.SetSuccessor(departmentHead);     departmentHead.SetSuccessor(ceo);      Request request1 = new Request() { Type = RequestType.RaiseSalary, Amount = 400 };     manager.ProcessRequest(request1);      Request request2 = new Request() { Type = RequestType.RaiseSalary, Amount = 1500 };     manager.ProcessRequest(request2);      Request request3 = new Request() { Type = RequestType.RaiseSalary, Amount = 6000 };     manager.ProcessRequest(request3); }
  输出结果: pythonCopy codeManager approved the request for raise of amount 400 Department head approved the request for raise of amount 1500 The request for raise of amount 6000 cannot be approved by anyone. 迭代器模式(Iterator Pattern)
  描述:迭代器模式是一种行为型设计模式, 它可以在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。 示例: csharpCopy codepublic class IteratorPatternExample {     static void Main(string[] args)     {         var collection = new ConcreteAggregate();         collection[0] = "One";         collection[1] = "Two";         collection[2] = "Three";         collection[3] = "Four";          var iterator = collection.CreateIterator();         Console.WriteLine("Iterating over collection:");         while (iterator.MoveNext())         {             var element = iterator.Current;             Console.WriteLine(element);         }     } }  public interface IIterator {     bool MoveNext();     T Current { get; }     void Reset(); }  public interface IAggregate {     IIterator CreateIterator(); }  public class ConcreteAggregate : IAggregate {     private List _items = new List();     public IIterator CreateIterator()     {         return new ConcreteIterator(this);     }      public int Count { get { return _items.Count; } }      public T this[int index]     {         get { return _items[index]; }         set { _items.Insert(index, value); }     } }  public class ConcreteIterator : IIterator {     private ConcreteAggregate _aggregate;     private int _currentIndex = 0;      public ConcreteIterator(ConcreteAggregate aggregate)     {         _aggregate = aggregate;     }      public T Current     {         get { return _aggregate[_currentIndex]; }     }      public bool MoveNext()     {         if (_currentIndex < _aggregate.Count)         {             _currentIndex++;             return true;         }         return false;     }      public void Reset()     {         _currentIndex = 0;     } } 中介者模式(Mediator Pattern)
  中介者模式用于降低多个对象之间的通信复杂性。该模式定义一个中介者对象,使得各个对象不需要显式地相互引用,从而降低耦合度,同时可以独立地改变对象之间的交互。
  代码示例: csharpCopy codepublic abstract class Mediator {     public abstract void Send(string message, Colleague colleague); }  public class ConcreteMediator : Mediator {     private ConcreteColleague1 colleague1;     private ConcreteColleague2 colleague2;      public ConcreteColleague1 Colleague1     {         set { colleague1 = value; }     }      public ConcreteColleague2 Colleague2     {         set { colleague2 = value; }     }      public override void Send(string message, Colleague colleague)     {         if (colleague == colleague1)         {             colleague2.Notify(message);         }         else         {             colleague1.Notify(message);         }     } }  public abstract class Colleague {     protected Mediator mediator;      public Colleague(Mediator mediator)     {         this.mediator = mediator;     }      public abstract void Send(string message);     public abstract void Notify(string message); }  public class ConcreteColleague1 : Colleague {     public ConcreteColleague1(Mediator mediator) : base(mediator) { }      public override void Send(string message)     {         mediator.Send(message, this);     }      public override void Notify(string message)     {         Console.WriteLine("Colleague1 gets message: " + message);     } }  public class ConcreteColleague2 : Colleague {     public ConcreteColleague2(Mediator mediator) : base(mediator) { }      public override void Send(string message)     {         mediator.Send(message, this);     }      public override void Notify(string message)     {         Console.WriteLine("Colleague2 gets message: " + message);     } } 备忘录模式(Memento Pattern)
  备忘录模式用于保存一个对象的状态,以便在以后可以恢复到该状态。该模式有三个角色:备忘录(Memento)负责存储对象的状态,原发器(Originator)负责创建备忘录和恢复备忘录,管理者(Caretaker)负责保存和恢复备忘录。
  代码示例: csharpCopy codepublic class Memento {     private string state;      public Memento(string state)     {         this.state = state;     }      public string State     {         get { return state; }     } }  public class Originator {     private string state;      public string State     {         get { return state; }         set { state = value; }     }      public Memento CreateMemento()     {         return new Memento(state);     }      public void SetMemento(Memento memento)     {         state = memento.State;     } }  public class Caretaker {     private Memento memento;      public Memento Memento     {         get { return memento; }         set { memento = value; }     } } 观察者模式(Observer Pattern)观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,所有依赖它的观察者都会自动收到通知并进行更新。 csharpCopy codepublic interface IObserver {     void Update(ISubject subject); }  public interface ISubject {     void Attach(IObserver observer);     void Detach(IObserver observer);     void Notify(); }  public class ConcreteSubject : ISubject {     private List observers = new List();     private int state;      public void Attach(IObserver observer)     {         observers.Add(observer);     }      public void Detach(IObserver observer)     {         observers.Remove(observer);     }      public void Notify()     {         foreach (var observer in observers)         {             observer.Update(this);         }     }      public int GetState()     {         return state;     }      public void SetState(int state)     {         this.state = state;         Notify();     } }  public class ConcreteObserver : IObserver {     private string name;      public ConcreteObserver(string name)     {         this.name = name;     }      public void Update(ISubject subject)     {         Console.WriteLine(#34;{name} received the message from {subject.GetType().Name}, the new state is {((ConcreteSubject)subject).GetState()}");     } }  class Program {     static void Main(string[] args)     {         ISubject subject = new ConcreteSubject();         IObserver observer1 = new ConcreteObserver("Observer 1");         IObserver observer2 = new ConcreteObserver("Observer 2");          subject.Attach(observer1);         subject.Attach(observer2);          ((ConcreteSubject)subject).SetState(1);          subject.Detach(observer1);          ((ConcreteSubject)subject).SetState(2);          Console.ReadLine();     } } 状态模式(State Pattern)
  状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式通过将复杂的条件语句转换为对象的形式,使得代码更加灵活、可维护和可扩展。
  在状态模式中,一个对象的行为取决于其内部状态,对象会根据不同的状态来执行不同的操作。这种模式是一种行为型模式。
  在状态模式中,主要有三种角色:上下文(Context)、抽象状态(State)、具体状态(ConcreteState)。其中,上下文是一个包含状态的对象,抽象状态是一个定义所有具体状态的接口,具体状态是实现状态的具体类。
  下面以电视遥控器为例,使用状态模式进行设计。当电视遥控器处于不同状态时,它会对按下的按钮产生不同的响应,例如当电视遥控器处于开机状态时,按下"换台"按钮会切换频道;当电视遥控器处于关机状态时,按下"换台"按钮则没有任何响应。
  首先,定义一个抽象状态接口: csharpCopy codepublic interface ITvState {     void TurnOn();     void TurnOff();     void NextChannel();     void PrevChannel(); }
  接下来,定义具体的状态类,这里定义了两个具体状态类,分别代表电视开机状态和电视关机状态: csharpCopy codepublic class TvOnState : ITvState {     public void TurnOn()     {         Console.WriteLine("电视已经开机");     }      public void TurnOff()     {         Console.WriteLine("电视关机");     }      public void NextChannel()     {         Console.WriteLine("下一个频道");     }      public void PrevChannel()     {         Console.WriteLine("上一个频道");     } }  public class TvOffState : ITvState {     public void TurnOn()     {         Console.WriteLine("电视开机");     }      public void TurnOff()     {         Console.WriteLine("电视已经关机");     }      public void NextChannel()     {         Console.WriteLine("电视已经关机,无法切换频道");     }      public void PrevChannel()     {         Console.WriteLine("电视已经关机,无法切换频道");     } }
  最后,定义上下文类,它包含了当前电视的状态,并提供了一些接口供外界使用: csharpCopy codepublic class TvContext {     private ITvState state;      public TvContext()     {         state = new TvOffState();     }      public void SetState(ITvState state)     {         this.state = state;     }      public void TurnOn()     {         state.TurnOn();         SetState(new TvOnState());     }      public void TurnOff()     {         state.TurnOff();         SetState(new TvOffState());     }      public void NextChannel()     {         state.NextChannel();     }      public void PrevChannel()     {         state.PrevChannel();     } }
  现在,我们就可以使用上下文类来操作电视遥控器了,例如: csharpCopy codeTvContext context = new TvContext();  context.TurnOn(); context.NextChannel(); context.NextChannel(); context.PrevChannel(); context.TurnOff();
  输出结果为: Copy code电视开机 下一个频道 下一个频道 上一个频道 电视关机 策略模式(Strategy Pattern)
  策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。该模式定义了一组算法,将每个算法封装起来,并使它们之间可以相互替换。
  下面是使用C#实现策略模式的示例代码: csharpCopy code// 抽象策略 public interface IStrategy {     void Execute(); }  // 具体策略 public class ConcreteStrategyA : IStrategy {     public void Execute()     {         Console.WriteLine("执行策略A");     } }  // 具体策略 public class ConcreteStrategyB : IStrategy {     public void Execute()     {         Console.WriteLine("执行策略B");     } }  // 上下文 public class Context {     private IStrategy _strategy;      public Context(IStrategy strategy)     {         _strategy = strategy;     }      public void SetStrategy(IStrategy strategy)     {         _strategy = strategy;     }      public void ExecuteStrategy()     {         _strategy.Execute();     } }  // 客户端代码 public class Client {     public static void Main()     {         // 创建上下文并设置初始策略         Context context = new Context(new ConcreteStrategyA());          // 执行策略A         context.ExecuteStrategy();          // 切换策略         context.SetStrategy(new ConcreteStrategyB());          // 执行策略B         context.ExecuteStrategy();     } }
  在这个示例中, IStrategy 是抽象策略,定义了策略的接口。ConcreteStrategyA 和ConcreteStrategyB 是具体策略,实现了策略接口。Context 是上下文,维护了一个策略对象,并且提供了一些方法来使用该策略。Client 是客户端代码,使用上下文对象来执行策略。在客户端代码中,我们首先创建了一个上下文对象并设置了一个初始策略。然后我们执行了策略A,接着我们切换了策略并执行了策略B。模板方法模式(Template Method Pattern)
  在模板方法模式中,有一个抽象类定义了一些抽象的方法和模板方法,模板方法是一个固定的算法流程,而抽象的方法则需要子类去实现。模板方法模式的目的是让子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  下面是一个简单的示例代码: csharpCopy codeusing System;  abstract class AbstractClass {     public void TemplateMethod()     {         Operation1();         Operation2();     }      public abstract void Operation1();     public abstract void Operation2(); }  class ConcreteClassA : AbstractClass {     public override void Operation1()     {         Console.WriteLine("ConcreteClassA.Operation1");     }      public override void Operation2()     {         Console.WriteLine("ConcreteClassA.Operation2");     } }  class ConcreteClassB : AbstractClass {     public override void Operation1()     {         Console.WriteLine("ConcreteClassB.Operation1");     }      public override void Operation2()     {         Console.WriteLine("ConcreteClassB.Operation2");     } }  class Program {     static void Main(string[] args)     {         AbstractClass c1 = new ConcreteClassA();         AbstractClass c2 = new ConcreteClassB();          c1.TemplateMethod();         c2.TemplateMethod();          Console.ReadKey();     } }
  在上面的代码中, AbstractClass  是一个抽象类,它有一个 TemplateMethod  方法,该方法调用了两个抽象方法 Operation1  和 Operation2 。具体的子类 ConcreteClassA  和 ConcreteClassB  分别实现了这两个抽象方法,并且可以在模板方法中按照特定的流程调用它们。
  当我们运行这个程序时,输出如下: Copy codeConcreteClassA.Operation1 ConcreteClassA.Operation2 ConcreteClassB.Operation1 ConcreteClassB.Operation2
  这表明模板方法模式确实在两个具体的子类中分别执行了它们的  Operation1  和 Operation2  方法,但是并没有改变模板方法的算法流程。访问者模式(Visitor Pattern)
  访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你定义算法(访问者),并将其与一组对象分离。访问者模式最常见的应用场景是在对象结构比较稳定的情况下,需要对对象结构中的对象进行各种不同的操作,且经常添加新的操作。
  下面是一个使用访问者模式的示例代码: csharpCopy codeusing System; using System.Collections.Generic;  // 访问者接口 interface IVisitor {     void Visit(ConcreteElementA elementA);     void Visit(ConcreteElementB elementB); }  // 抽象元素类 abstract class Element {     public abstract void Accept(IVisitor visitor); }  // 具体元素类 A class ConcreteElementA : Element {     public override void Accept(IVisitor visitor)     {         visitor.Visit(this);     }      public void OperationA()     {         Console.WriteLine("ConcreteElementA.OperationA()");     } }  // 具体元素类 B class ConcreteElementB : Element {     public override void Accept(IVisitor visitor)     {         visitor.Visit(this);     }      public void OperationB()     {         Console.WriteLine("ConcreteElementB.OperationB()");     } }  // 具体访问者类 class ConcreteVisitor : IVisitor {     public void Visit(ConcreteElementA elementA)     {         elementA.OperationA();     }      public void Visit(ConcreteElementB elementB)     {         elementB.OperationB();     } }  // 对象结构类 class ObjectStructure {     private List elements = new List();      public void Attach(Element element)     {         elements.Add(element);     }      public void Detach(Element element)     {         elements.Remove(element);     }      public void Accept(IVisitor visitor)     {         foreach (Element element in elements)         {             element.Accept(visitor);         }     } }  // 客户端代码 class Client {     static void Main()     {         ObjectStructure objectStructure = new ObjectStructure();         objectStructure.Attach(new ConcreteElementA());         objectStructure.Attach(new ConcreteElementB());          ConcreteVisitor visitor = new ConcreteVisitor();         objectStructure.Accept(visitor);          Console.ReadKey();     } }
  在上面的示例中, IVisitor  定义了访问者的接口,包含了对每个具体元素类的访问方法。Element  是抽象元素类,定义了 Accept  方法,接受访问者的访问。ConcreteElementA  和 ConcreteElementB  是具体元素类,实现了 Accept  方法,并且定义了各自的操作方法。ConcreteVisitor  是具体访问者类,实现了 IVisitor  接口,实现了对每个具体元素的操作。ObjectStructure  是对象结构类,包含了元素对象集合,并提供了 Accept  方法,接受访问者的访问。客户端代码通过创建 ObjectStructure  对象,向其中添加具体元素对象,并创建 ConcreteVisitor  对象进行访问操作。
  文章来源于token的技术分享 ,作者tokengo
  token的技术分享 .
  分享.NET生态技术,和.NET相关知识

福布斯香港富豪榜公布!首富还是他!福布斯香港富豪榜公布,李嘉诚再蝉联香港首富,身家抛离第二位近700亿港元。香港经济于去年收缩3。5,福布斯2023年香港富豪榜香港排名前50的富豪整体财富下跌1,由对上一年的328近十年经济逆袭的黑马与深圳差距到底有多远?合肥的体积只有西安的一半。我们说的是市区。经济发展压倒西安,意味着它更有后劲。我是安徽人,但我是中立的。西安的资源环境人口基数都比不上合肥。合肥环境优美,气候宜人,地理位置优越,母一季度广西国资国企强力推进重大项目开工建设来源人民网人民网南宁2月24日电(王功孝)2月23日下午,广西壮族自治区人民政府新闻办公室在南宁举行扎实推动一季度经济工作系列主题第十二场新闻发布会全区国资国企稳增长新闻发布会。据一文让你了解我们手中的银行卡银行卡是一个统称,是由银行进行发卡,按是否能透支分为借记卡和贷记卡两种,其中借记卡又分为转账卡储蓄卡专用卡储值卡四种,贷记卡又分为信用卡和准贷记卡兼有借记卡功能但是有一定的透支额度认养一头185亿的牛,到底值不值?核心提示当认养标签被撕掉,渠道危机若隐若现,认养一头牛靠什么支撑起185亿估值?凭借着认养一头牛不是牛奶公司,我们是一家养牛公司的概念,抓住线上社交电商崛起的红利,将乳业巨头们盘踞湖湘好网民丨谭敏(安如好)签约网络文学创作十年,每一部作品都蕴含积极向上的能量视频加载中编者按2月8日,由湖南省委网信办主办湖南红网新媒体集团承办的2022年度湖湘好网民新风大典评选颁奖仪式在红网演播中心举行,2022年度湖湘好网民获奖名单现场揭晓。网络作家中泰一家亲!泰国旅游局为中国提供全面有针对性的产品和服务泰国政府近日正式宣布2023年是泰国旅游年,在这一主题下泰国国家旅游局将用神奇泰国新篇章的主旋律来推动泰国旅游业在新一年度全面发展。中国市场是泰国旅游的重要组成部分,关注中国市场的多地延长婚假!最长达到30天据不完全统计,目前已有四川成都江苏南京天津安徽江西等多地明确延长婚假。其中甘肃山西两省婚假最长达到30天江苏南京可以享受婚假15天。在黑龙江河南陕西宁夏等地,若主动参加婚检,可以获2023年首月广东中行实现涉农贷款新增投放超17亿元记者近日获悉,2023年首月,广东中行实现涉农贷款新增投放超17亿元,其中为近40户种植类经营主体提供授信支持超6000万元。广东是全国人口第一大省,也是第一大粮食主销区。入春以来燃油新能源双驱动,捷达加速产品升级迭代来源中国经济网伴随着缺芯疫情及贵电等不利因素的影响,捷达品牌在充满挑战的2022年,以用户需求与市场变化为导向,实现了品牌跃迁式发展。过去的一年,捷达品牌发布美好生活?一路捷达品牌如何把产品模型放到网站上进行3D展示或者3D互动?来自荐一下我们平台一站式在线3D数字设计协作平台Realibox(httpswww。realibox。com)我们平台可以完美实现网页端的3D展示,还可以嵌入官网小程序各种平台,而
iPhone14要黄了,1月销量大幅下滑,网友小米11升级继续用苹果春季发布会已经确定将会在3月份发布,此次依旧会带来多款新品。其中国内用户比较关心的是新iPhone有没有动静。考虑到iPhoneSE4的消息最近才报告,大概率要等到明年才会上市产能200万吨!2月份金凤凰(孝感)纸业喜事不断70万吨扩能项目全部投产,至此,公司产能达200万吨获评湖北省高新技术企业百强司机之家项目跻身全国验收合格名单增资扩能,这些关键词与发展势头一脉相承负债率有所提升!3次延期回复关注函后,豪掷百亿跨界光伏的珠宝商回应了!下周解禁压力较小,解禁股名单来了数据是个宝数据宝炒股少烦恼投资百亿元跨界光伏,珠宝商回应了这些内容下周解禁压力较小。在连续3次发布延期回复关注函的公告后,明牌珠宝在昨日晚间终于发布回复函,对此前深交所下发的关注函沐鸿洋3。4本周黄金强势上涨行情总结及下周走势分析交易实为人性的考验,在获利之中能否坚持,在亏损之中能否果断离场,很多人说的容易,但是真正做到确实很难,行情不会简单的一直涨或者一直跌,而大多数人受到行情的涨跌会影响初心,趋势未改变工信部尽快明确新能源汽车车购税减免等接续政策北京日报客户端记者赵语涵2022年,我国新能源汽车产销规模接近700万辆左右,持续保持全球第一。今年新能源汽车市场发展走势如何?工业和信息化部副部长辛国斌在3月1日国新办举办的发布京西大悦城计划6月18日开业3月4日,北京青年报记者从石景山区获悉,京西大悦城计划于今年6月18日开业。京西大悦城为购物中心写字楼的城市综合体项目,位于石景山区阜石路北侧,总体量23万平方米,其中商业11万平规范城投融资监管点名政信类信托违规风险本报记者陈嘉玲广州报道近期监管特别提示政信业务正在抬升的风险。一些地方城投平台有让信托公司以政信信托项目隐藏风险的冲动,也存在信托公司违规协助地方新增隐性债务。某信托公司副总对中国让党的旗帜高高飘扬,永葆共产党人本色十年树木,百年树人,百年大计,教育为本,3月1日,中央党校举行建校90周年庆祝大会暨2023年春季学期开学典礼。大会强调党校始终不变的初心就是为党育才为党献策。各级党校要坚守初心,新疆美食即将展开榜单角逐看下有你心仪的么?近日,新疆餐饮协会2023年系列活动启动仪式暨新疆餐饮协会2022年年会在昆仑宾馆召开,200多位来自全疆各地的餐饮文旅金融等各行业代表们汇聚一堂,探讨餐饮品牌发展之路,共谋餐饮行智能楼宇浙江大华DH30N03C网桥配置教程老赵在湖北案例技术记录分享项目地址湖北武汉F天下别墅区智能家居弱电施工智能楼宇DHWBK530N03C网桥配置方式前言网桥接入点及客户端默认地址192。168。1。36用户密码默认比亚迪护卫舰07购车手册,追求性价比,首推205KM尊贵型比亚迪全新中型SUV护卫舰07正式上市,售价20。2828。98万元,搭载基于1。5T发动机打造的插混系统。纯电续航最大205公里,最大对外放电6。6千瓦,可以说是兼顾了城市内纯电