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

用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相关知识

40!罗伯逊横扫6届世锦赛亚军,中国斯诺克3胜2负,双子星晋级北京时间3月1日,2022斯诺克威尔士公开赛延期资格赛结束多场比赛较量,在两场焦点战中,尼尔罗伯逊40横扫60岁无冕之王吉米怀特。小钢炮马克艾伦则是41大胜53岁世界冠军达赫迪。两夜读丨醒悟,从三次接受开始文字丨郝银主播丨紫藤人生的成长,就是一次次尝试,一次次失败,一次次跌倒,一次次站起。然后思考反省,擦去含泪,再重新上路。1接受自己的不完美,更加努力孩童时,父母视孩子为珍宝,世界全一箭22星5颗海淀造2022年2月27日11时06分,长征八号遥二运载火箭在海南文昌发射中心执行一箭22星拼车发射任务,创下了我国一次发射卫星数量最多的纪录。这22颗卫星中有5颗是由来自北京海淀的企业国足又要输?吴曦被罚禁赛,沙特扬言5天集训大胜国足,霄鹏下课国足1比3惨败越南后,已经彻底无缘2022年卡塔尔世界杯,但是国足在世预赛还有2场球要踢,分别是3月24日对阵沙特阿拉伯,3月29日对阵阿曼,一点也不夸张地说这两场球并不好踢,不管短短半年!被篮网抛弃,又被湖人抛弃,他能在76人东山再起吗?啃老本!依靠过去的积蓄生活,球员们也是一样,年轻时入选个全明星,入选个一阵二阵,积攒下雄厚的资本,年纪大了,即使威风不在,但是依然会有球队买单。短短半年!被篮网抛弃,又被湖人抛弃,悍将归来!湖人已无看点,爵士面临危险,约基奇迎回2144帮手前言目前的西部看似风平浪静,实则暗藏汹涌,太阳稳居第一但在季后赛的紧要关头缺席了核心保罗,勇士虽被诟病内线但怀斯曼和格林也都将复出,灰熊正在莫兰特的带领下打下一场场硬仗,森林狼也脱网约车合规运营在提速,三证不齐现象仍然存在目前,网约车已经成为重要的新业态,方便了人们出行,也促进了社会就业。但在行业快速发展的同时,也出现了一些问题。为此,交通部门出台多个规范性文件,并约谈网约车平台。在此背景下,网约车深入理解Java类加载机制,再也不用死记硬背了谈谈会的三个层次在说透分布式事务中,我举例里说明了会与会的差别。对一门语言的学习,这里谈谈我理解的会的三个层次第一层了解这门语言的语法写法,我把它叫做helloworld级别第二层2022年,如何实现家庭影院影音唱一体化?你有没有发现,近两年我们的娱乐方式正悄然地发生一些变化,因为疫情,我们的娱乐生活逐渐回归到家庭。以家庭娱乐为中心的相关行业或者相关产品,比如体感游戏,家庭健身,家庭影音,家庭K歌慢曹德旺预判真准!国内超4成城镇家庭,未来需要面对什么?关于房产经济的走向对于老百姓来说始终是个谜,就像我们知道现如今楼市价格肯定会下降,可问题是不知道它们什么时候会下降,也不知道我们的经济情况是否能撑到那段美好时期的来临。在这一背景下知己知彼才能百战百胜首先要说是M762,M762在吃鸡里被不少玩家评为最强步枪,因为它有着非常优秀的射速以及单发伤害,爆发输出超过AKM,可以迅速击倒身穿3级甲的玩家。不过大部分玩家都掌握不好这把武器
你OUT了吗,for双层循环可以使用stream方式替代糟粕代码java8已经出了Stream流处理方式,但是实际业务开发时,大部分同学还是下意识的去写for双层循环。一眼看穿繁华这段代码写法就是典型的for双层循环,我们再细看业务逻辑如何便宜买到登山徒步露营装备10个购买户外装备的省钱技巧登山穿越徒步旅行能给你的生活增添不少的刺激与乐趣。然而,大量购买户外装备会让你的预算很快就增加不少,会让你的户外活动成为一种昂贵的消遣。那么,如何在登山穿越背包旅行上省钱,也成为了人老80,还能做这些事情,一般会更长寿前言80岁,不管是男人还是女人,实际上已经不年轻了,在这个时候有一个美好的生活是最关键的。如果生活不好过的话,其实活着也不是很开心,在这个世界上每一个人到达一定的年纪,其实都是一种北京冬奥会惊艳世界,体育留学也在悄然升温2022年北京冬季奥运会的举办,意义非凡,体现中国综合国力的强盛,对中国体育产业的发展有促进作用。近几年来,我国一直在大力发展体育产业,十三五十四五计划中都着重强调了体育事业的发展一个人,长期缺爱的特征文夏莫01卷首语爱是世界上最美好的情感,它就像是寒冬腊月里一缕热腾腾的人间烟火,就像是夏日里从河畔吹来的徐徐晚风。当你的内心觉得无助绝望的时候,爱就是滋润你心灵的一剂良药,让你重新善待今天,不负今生不负己文小为图片网络过去了,就不要再回头了,毕竟都已远去,觅不到踪影,枉费精力,只是捉住了一个空。过好今天吧,就在眼前,看得到,摸得着的现在,让今天生动起来,让未来的你有几多美好的回忆!晚安问候语靠自己的努力赚钱不丢人晚安问候语Feb8(1)如果有一天你觉得太累了,就好好睡一觉,不用责怪自己,我知道你也是很努力才走到现在的!晚安(2)每日一签2022。02。08靠自己的努力赚钱不丢人,丢人的是明黄仁勋终究难成乔布斯一个属于黄仁勋的时代还没开始就迎来了落幕。2月8日,英伟达和软银集团双双宣布,英伟达对Arm的收购交易终止。至此,这场为时一年多的芯片行业最大规模收购案以失败告终。尽管英伟达创始人员工猝死背后内容安全,B站止不住的出血口21世纪经济报道记者贺泓源北京报道B站连续成为焦点都来自一件事。2月8日深夜,B站官方微博发长文再次对员工过年值班猝死一事进行了说明,并表示下一步将用最大力度扩招审核人员,同时加强男足一年吸金3亿,女足赞助寥寥,网友赞助商卷起来,给女足加钱本文来源时代周报作者何明俊时隔16年,中国女足再次捧起亚洲杯冠军。如何重奖女足姑娘,网友操碎了心。中国足协中国之队官方合作伙伴蒙牛乳业宣布,给予中国女足1000万元现金奖励。支付宝既然光速是宇宙最快的速度,那信息传播能做到光速吗?光速是宇宙的速度极限,我们知道,人类已经从原则上否认了光速飞船的可能,因为任何一个有质量大的的飞行器,基本上都是无法实现光速的。,人类没有办法利用光速在宇宙中穿行,但是人类还是对光