专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  工厂方法模式(FactoryMethodPattern)
  工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把对象的实例化推迟到子类。
  代码示例:csharpCopycodepublicinterfaceIProduct{voidOperation();}publicclassProductA:IProduct{publicvoidOperation(){Console。WriteLine(ProductAoperation);}}publicclassProductB:IProduct{publicvoidOperation(){Console。WriteLine(ProductBoperation);}}publicabstractclassCreator{publicabstractIProductFactoryMethod();}publicclassConcreteCreatorA:Creator{publicoverrideIProductFactoryMethod(){returnnewProductA();}}publicclassConcreteCreatorB:Creator{publicoverrideIProductFactoryMethod(){returnnewProductB();}}抽象工厂模式(AbstractFactoryPattern)
  抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
  代码示例:csharpCopycodepublicinterfaceIProductA{voidOperationA();}publicinterfaceIProductB{voidOperationB();}publicclassProductA1:IProductA{publicvoidOperationA(){Console。WriteLine(ProductA1operation);}}publicclassProductA2:IProductA{publicvoidOperationA(){Console。WriteLine(ProductA2operation);}}publicclassProductB1:IProductB{publicvoidOperationB(){Console。WriteLine(ProductB1operation);}}publicclassProductB2:IProductB{publicvoidOperationB(){Console。WriteLine(ProductB2operation);}}publicinterfaceIAbstractFactory{IProductACreateProductA();IProductBCreateProductB();}publicclassConcreteFactory1:IAbstractFactory{publicIProductACreateProductA(){returnnewProductA1();}publicIProductBCreateProductB(){returnnewProductB1();}}publicclassConcreteFactory2:IAbstractFactory{publicIProductACreateProductA(){returnnewProductA2();}publicIProductBCreateProductB(){returnnewProductB2();}}单例模式(SingletonPattern)
  单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。
  代码示例:csharpCopycodepublicsealedclassSingleton{privatestaticSingletoninstancenull;privateSingleton(){}publicstaticSingletonInstance{get{if(instancenull){instancenewSingleton();}returninstance;}}}建造者模式(BuilderPattern)
  建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程和它的表示分离,使得同样的构建过程可以创建不同的表示。
  代码示例:csharpCopycodepublicclassProduct{publicstringPartA{get;set;}publicstringPartB{get;set;}publicstringPartC{get;set;}publicoverridestringToString(){return34;{PartA},{PartB},{PartC};}}publicinterfaceIBuilder{voidBuildPartA();voidBuildPartB();voidBuildPartC();ProductGetResult();}publicclassConcreteBuilder:IBuilder{privateProductproductnewProduct();publicvoidBuildPartA(){product。PartAPartA;}publicvoidBuildPartB(){product。PartBPartB;}publicvoidBuildPartC(){product。PartCPartC;}publicProductGetResult(){returnproduct;}}publicclassDirector{privateIBuilderbuilder;publicDirector(IBuilderbuilder){this。builderbuilder;}publicvoidConstruct(){builder。BuildPartA();builder。BuildPartB();builder。BuildPartC();}}原型模式(PrototypePattern)
  原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化的方式。
  代码示例:csharpCopycodepublicclassPrototype:ICloneable{publicstringValue{get;set;}publicobjectClone(){returnMemberwiseClone();}}适配器模式(AdapterPattern)
  适配器模式是一种结构型设计模式,它可以将一种类的接口转换成客户端希望的另一种接口。适配器模式允许接口不兼容的类能够合作。
  代码示例:csharpCopycodepublicinterfaceITarget{voidRequest();}publicclassAdaptee{publicvoidSpecificRequest(){Console。WriteLine(Adapteespecificrequest);}}publicclassAdapter:ITarget{privatereadonlyAdapteeadaptee;publicAdapter(Adapteeadaptee){this。adapteeadaptee;}publicvoidRequest(){adaptee。SpecificRequest();}}桥接模式(BridgePattern)
  桥接模式是一种结构型设计模式,它可以将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。
  代码示例:csharpCopycodepublicinterfaceIImplementor{voidOperationImp();}publicclassConcreteImplementorA:IImplementor{publicvoidOperationImp(){Console。WriteLine(ConcreteImplementorAOperationImp);}}publicclassConcreteImplementorB:IImplementor{publicvoidOperationImp(){Console。WriteLine(ConcreteImplementorBOperationImp);}}publicabstractclassAbstraction{protectedIImplementorimplementor;protectedAbstraction(IImplementorimplementor){this。implementorimplementor;}publicabstractvoidOperation();}publicclassRefinedAbstraction:Abstraction{publicRefinedAbstraction(IImplementorimplementor):base(implementor){}publicoverridevoidOperation(){implementor。OperationImp();}}组合模式(CompositePattern)
  组合模式是一种结构型设计模式,它允许将对象组合成树形结构来表现整体部分关系。组合能让客户端统一处理单个对象和对象组合。
  代码示例:csharpCopycodepublicabstractclassComponent{protectedreadonlystringname;publicComponent(stringname){this。namename;}publicabstractvoidOperation();}publicclassLeaf:Component{publicLeaf(stringname):base(name){}publicoverridevoidOperation(){Console。WriteLine(34;Leaf{name}Operation);}}publicclassComposite:Component{privatereadonlyListComponentchildrennewListComponent();publicComposite(stringname):base(name){}publicoverridevoidOperation(){Console。WriteLine(34;Composite{name}Operation);foreach(varchildinchildren){child。Operation();}}publicvoidAdd(Componentcomponent){children。Add(component);}publicvoidRemove(Componentcomponent){children。Remove(component);}}桥接模式(BridgePattern)
  桥接模式是一种结构型设计模式,它将抽象与实现分离,以便它们可以独立地进行变化。
  代码示例:csharpCopycodepublicinterfaceIImplementor{voidOperationImp();}publicclassConcreteImplementorA:IImplementor{publicvoidOperationImp(){Console。WriteLine(ConcreteImplementorAOperationImp);}}publicclassConcreteImplementorB:IImplementor{publicvoidOperationImp(){Console。WriteLine(ConcreteImplementorBOperationImp);}}publicabstractclassAbstraction{protectedIImplementorimplementor;publicAbstraction(IImplementorimplementor){this。implementorimplementor;}publicabstractvoidOperation();}publicclassRefinedAbstraction:Abstraction{publicRefinedAbstraction(IImplementorimplementor):base(implementor){}publicoverridevoidOperation(){implementor。OperationImp();}}外观模式(FacadePattern)
  外观模式是一种结构型设计模式,它为复杂的子系统提供简单的接口,从而使子系统更易于使用。
  代码示例:csharpCopycodepublicclassSubsystemA{publicvoidOperationA(){Console。WriteLine(SubsystemAOperationA);}}publicclassSubsystemB{publicvoidOperationB(){Console。WriteLine(SubsystemBOperationB);}}publicclassFacade{privatereadonlySubsystemAsubsystemA;privatereadonlySubsystemBsubsystemB;publicFacade(SubsystemAsubsystemA,SubsystemBsubsystemB){this。subsystemAsubsystemA;this。subsystemBsubsystemB;}publicvoidOperation(){subsystemA。OperationA();subsystemB。OperationB();}}享元模式(FlyweightPattern)
  享元模式是一种结构型设计模式,它通过共享尽可能多的数据来最小化内存使用和计算开销。享元模式适用于需要大量对象的情况,同时又要求对象能够轻量化。
  代码示例:csharpCopycodepublicclassFlyweightFactory{privatereadonlyDictionarychar,FlyweightflyweightsnewDictionarychar,Flyweight();publicFlyweightGetFlyweight(charkey){if(!flyweights。TryGetValue(key,outvarflyweight)){flyweightnewConcreteFlyweight(key);flyweights〔key〕flyweight;}returnflyweight;}}publicabstractclassFlyweight{publicabstractvoidOperation();}publicclassConcreteFlyweight:Flyweight{privatereadonlycharintrinsicState;publicConcreteFlyweight(charintrinsicState){this。intrinsicStateintrinsicState;}publicoverridevoidOperation(){Console。WriteLine(34;ConcreteFlyweight{intrinsicState}Operation);}}publicclassUnsharedConcreteFlyweight:Flyweight{privatereadonlystringextrinsicState;publicUnsharedConcreteFlyweight(stringextrinsicState){this。extrinsicStateextrinsicState;}publicoverridevoidOperation(){Console。WriteLine(34;UnsharedConcreteFlyweight{extrinsicState}Operation);}}组合模式(CompositePattern)
  组合模式是一种结构型设计模式,允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们。
  适用场景:
  1。当你想表示对象的部分整体层次结构时。
  2。当你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时。
  组合模式中的关键类:Component(组件):是组合中的对象声明接口,在适当情况下,实现所有类共有的接口默认行为。声明一个接口用于访问和管理Component子部件。Leaf(叶子):在组合中表示子节点对象,叶子节点没有子节点。Composite(容器):定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加Add和删除Remove。
  代码示例:
  下面是一个组合模式的示例,我们以一个目录结构为例来实现组合模式。目录中可以包含文件和文件夹,文件夹中又可以包含文件和文件夹。csharpCopycode抽象构件publicabstractclassComponent{protectedstringname;publicComponent(stringname){this。namename;}publicabstractvoidAdd(Componentc);publicabstractvoidRemove(Componentc);publicabstractvoidDisplay(intdepth);}叶子节点publicclassLeaf:Component{publicLeaf(stringname):base(name){}publicoverridevoidAdd(Componentc){Console。WriteLine(不能向叶子节点添加节点);}publicoverridevoidRemove(Componentc){Console。WriteLine(不能从叶子节点移除节点);}publicoverridevoidDisplay(intdepth){Console。WriteLine(newstring(,depth)name);}}容器节点publicclassComposite:Component{privateListComponentchildrennewListComponent();publicComposite(stringname):base(name){}publicoverridevoidAdd(Componentc){children。Add(c);}publicoverridevoidRemove(Componentc){children。Remove(c);}publicoverridevoidDisplay(intdepth){Console。WriteLine(newstring(,depth)name);foreach(Componentcomponentinchildren){component。Display(depth2);}}}客户端代码classClient{staticvoidMain(string〔〕args){CompositerootnewComposite(C:);CompositewindowsnewComposite(Windows);CompositeprogramFilesnewComposite(ProgramFiles);Leaffile1newLeaf(a。txt);Leaffile2newLeaf(b。txt);Leaffile3newLeaf(c。txt);root。Add(windows);root。Add(programFiles);windows。Add(file1);windows。Add(file2);programFiles。Add(file3);root。Display(0);Console。ReadKey();}}Proxy(代理模式)
  代理模式为其他对象提供一种代理以控制对这个对象的访问。代理类与实际类具有相同的接口,这样就可以使用代理来代替实际类,使得在不改变原始代码的情况下增加了一些额外的功能。常用的代理模式有远程代理、虚拟代理、保护代理、缓存代理等。
  代码示例:csharpCopycode实际类publicclassRealSubject:ISubject{publicvoidRequest(){Console。WriteLine(RealSubject:HandlingRequest。);}}代理类publicclassProxy:ISubject{privatereadonlyRealSubjectrealSubject;publicProxy(RealSubjectrealSubject){realSubjectrealSubject;}publicvoidRequest(){if(CheckAccess()){realSubject。Request();LogAccess();}}privateboolCheckAccess(){Console。WriteLine(Proxy:Checkingaccesspriortofiringarealrequest。);returntrue;}privatevoidLogAccess(){Console。WriteLine(Proxy:Loggingthetimeofrequest。);}}接口类publicinterfaceISubject{voidRequest();}使用代理staticvoidMain(string〔〕args){varrealSubjectnewRealSubject();varproxynewProxy(realSubject);proxy。Request();}Command(命令模式)
  命令模式是一种行为型模式,它通过将请求封装为一个对象来实现请求的发送者和接收者之间的解耦。命令对象包含了要执行的操作以及其相关的数据,可以把命令对象看成是一个操作的载体。常用的命令模式有简单命令、复杂命令、队列请求等。
  代码示例:csharpCopycode命令接口publicinterfaceICommand{voidExecute();}具体命令publicclassConcreteCommand:ICommand{privatereadonlyReceiverreceiver;publicConcreteCommand(Receiverreceiver){receiverreceiver;}publicvoidExecute(){receiver。Action();}}接收者publicclassReceiver{publicvoidAction(){Console。WriteLine(Receiver:Action。);}}发送者publicclassInvoker{privateICommandcommand;publicvoidSetCommand(ICommandcommand){commandcommand;}publicvoidExecuteCommand(){command。Execute();}}使用命令模式staticvoidMain(string〔〕args){varreceivernewReceiver();varcommandnewConcreteCommand(receiver);varinvokernewInvoker();invoker。SetCommand(command);invoker。ExecuteCommand();}责任链模式(ChainofResponsibilityPattern)
  责任链模式是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理为止。
  在责任链模式中,每个处理器都只关心它自己能够处理的请求,并把它转发给下一个处理器。这样,请求者与处理器之间的耦合就被解除了,可以动态地改变请求的处理顺序或者增加删除处理器。
  代码示例:
  下面是一个简单的例子,用来演示使用责任链模式实现不同等级的员工申请加薪请求的处理:csharpCopycodeabstractclassApprover{protectedApproversuccessor;publicvoidSetSuccessor(Approversuccessor){this。successorsuccessor;}publicabstractvoidProcessRequest(Requestrequest);}classManager:Approver{publicoverridevoidProcessRequest(Requestrequest){if(request。TypeRequestType。RaiseSalaryrequest。Amount500){Console。WriteLine(34;Managerapprovedtherequestforraiseofamount{request。Amount});}elseif(successor!null){successor。ProcessRequest(request);}}}classDepartmentHead:Approver{publicoverridevoidProcessRequest(Requestrequest){if(request。TypeRequestType。RaiseSalaryrequest。Amount1000){Console。WriteLine(34;Departmentheadapprovedtherequestforraiseofamount{request。Amount});}elseif(successor!null){successor。ProcessRequest(request);}}}classCEO:Approver{publicoverridevoidProcessRequest(Requestrequest){if(request。TypeRequestType。RaiseSalaryrequest。Amount5000){Console。WriteLine(34;CEOapprovedtherequestforraiseofamount{request。Amount});}else{Console。WriteLine(34;Therequestforraiseofamount{request。Amount}cannotbeapprovedbyanyone。);}}}classRequest{publicRequestTypeType{get;set;}publicintAmount{get;set;}}enumRequestType{RaiseSalary}staticvoidMain(string〔〕args){ManagermanagernewManager();DepartmentHeaddepartmentHeadnewDepartmentHead();CEOceonewCEO();manager。SetSuccessor(departmentHead);departmentHead。SetSuccessor(ceo);Requestrequest1newRequest(){TypeRequestType。RaiseSalary,Amount400};manager。ProcessRequest(request1);Requestrequest2newRequest(){TypeRequestType。RaiseSalary,Amount1500};manager。ProcessRequest(request2);Requestrequest3newRequest(){TypeRequestType。RaiseSalary,Amount6000};manager。ProcessRequest(request3);}
  输出结果:pythonCopycodeManagerapprovedtherequestforraiseofamount400Departmentheadapprovedtherequestforraiseofamount1500Therequestforraiseofamount6000cannotbeapprovedbyanyone。迭代器模式(IteratorPattern)
  描述:迭代器模式是一种行为型设计模式,它可以在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。示例:csharpCopycodepublicclassIteratorPatternExample{staticvoidMain(string〔〕args){varcollectionnewConcreteAggregatestring();collection〔0〕One;collection〔1〕Two;collection〔2〕Three;collection〔3〕Four;variteratorcollection。CreateIterator();Console。WriteLine(Iteratingovercollection:);while(iterator。MoveNext()){varelementiterator。Current;Console。WriteLine(element);}}}publicinterfaceIIteratorT{boolMoveNext();TCurrent{get;}voidReset();}publicinterfaceIAggregateT{IIteratorTCreateIterator();}publicclassConcreteAggregateT:IAggregateT{privateListTitemsnewListT();publicIIteratorTCreateIterator(){returnnewConcreteIteratorT(this);}publicintCount{get{returnitems。Count;}}publicTthis〔intindex〕{get{returnitems〔index〕;}set{items。Insert(index,value);}}}publicclassConcreteIteratorT:IIteratorT{privateConcreteAggregateTaggregate;privateintcurrentIndex0;publicConcreteIterator(ConcreteAggregateTaggregate){aggregateaggregate;}publicTCurrent{get{returnaggregate〔currentIndex〕;}}publicboolMoveNext(){if(currentIndexaggregate。Count){currentIndex;returntrue;}returnfalse;}publicvoidReset(){currentIndex0;}}中介者模式(MediatorPattern)
  中介者模式用于降低多个对象之间的通信复杂性。该模式定义一个中介者对象,使得各个对象不需要显式地相互引用,从而降低耦合度,同时可以独立地改变对象之间的交互。
  代码示例:csharpCopycodepublicabstractclassMediator{publicabstractvoidSend(stringmessage,Colleaguecolleague);}publicclassConcreteMediator:Mediator{privateConcreteColleague1colleague1;privateConcreteColleague2colleague2;publicConcreteColleague1Colleague1{set{colleague1value;}}publicConcreteColleague2Colleague2{set{colleague2value;}}publicoverridevoidSend(stringmessage,Colleaguecolleague){if(colleaguecolleague1){colleague2。Notify(message);}else{colleague1。Notify(message);}}}publicabstractclassColleague{protectedMediatormediator;publicColleague(Mediatormediator){this。mediatormediator;}publicabstractvoidSend(stringmessage);publicabstractvoidNotify(stringmessage);}publicclassConcreteColleague1:Colleague{publicConcreteColleague1(Mediatormediator):base(mediator){}publicoverridevoidSend(stringmessage){mediator。Send(message,this);}publicoverridevoidNotify(stringmessage){Console。WriteLine(Colleague1getsmessage:message);}}publicclassConcreteColleague2:Colleague{publicConcreteColleague2(Mediatormediator):base(mediator){}publicoverridevoidSend(stringmessage){mediator。Send(message,this);}publicoverridevoidNotify(stringmessage){Console。WriteLine(Colleague2getsmessage:message);}}备忘录模式(MementoPattern)
  备忘录模式用于保存一个对象的状态,以便在以后可以恢复到该状态。该模式有三个角色:备忘录(Memento)负责存储对象的状态,原发器(Originator)负责创建备忘录和恢复备忘录,管理者(Caretaker)负责保存和恢复备忘录。
  代码示例:csharpCopycodepublicclassMemento{privatestringstate;publicMemento(stringstate){this。statestate;}publicstringState{get{returnstate;}}}publicclassOriginator{privatestringstate;publicstringState{get{returnstate;}set{statevalue;}}publicMementoCreateMemento(){returnnewMemento(state);}publicvoidSetMemento(Mementomemento){statememento。State;}}publicclassCaretaker{privateMementomemento;publicMementoMemento{get{returnmemento;}set{mementovalue;}}}观察者模式(ObserverPattern)观察者模式(ObserverPattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,所有依赖它的观察者都会自动收到通知并进行更新。csharpCopycodepublicinterfaceIObserver{voidUpdate(ISubjectsubject);}publicinterfaceISubject{voidAttach(IObserverobserver);voidDetach(IObserverobserver);voidNotify();}publicclassConcreteSubject:ISubject{privateListIObserverobserversnewListIObserver();privateintstate;publicvoidAttach(IObserverobserver){observers。Add(observer);}publicvoidDetach(IObserverobserver){observers。Remove(observer);}publicvoidNotify(){foreach(varobserverinobservers){observer。Update(this);}}publicintGetState(){returnstate;}publicvoidSetState(intstate){this。statestate;Notify();}}publicclassConcreteObserver:IObserver{privatestringname;publicConcreteObserver(stringname){this。namename;}publicvoidUpdate(ISubjectsubject){Console。WriteLine(34;{name}receivedthemessagefrom{subject。GetType()。Name},thenewstateis{((ConcreteSubject)subject)。GetState()});}}classProgram{staticvoidMain(string〔〕args){ISubjectsubjectnewConcreteSubject();IObserverobserver1newConcreteObserver(Observer1);IObserverobserver2newConcreteObserver(Observer2);subject。Attach(observer1);subject。Attach(observer2);((ConcreteSubject)subject)。SetState(1);subject。Detach(observer1);((ConcreteSubject)subject)。SetState(2);Console。ReadLine();}}状态模式(StatePattern)
  状态模式(StatePattern)是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式通过将复杂的条件语句转换为对象的形式,使得代码更加灵活、可维护和可扩展。
  在状态模式中,一个对象的行为取决于其内部状态,对象会根据不同的状态来执行不同的操作。这种模式是一种行为型模式。
  在状态模式中,主要有三种角色:上下文(Context)、抽象状态(State)、具体状态(ConcreteState)。其中,上下文是一个包含状态的对象,抽象状态是一个定义所有具体状态的接口,具体状态是实现状态的具体类。
  下面以电视遥控器为例,使用状态模式进行设计。当电视遥控器处于不同状态时,它会对按下的按钮产生不同的响应,例如当电视遥控器处于开机状态时,按下换台按钮会切换频道;当电视遥控器处于关机状态时,按下换台按钮则没有任何响应。
  首先,定义一个抽象状态接口:csharpCopycodepublicinterfaceITvState{voidTurnOn();voidTurnOff();voidNextChannel();voidPrevChannel();}
  接下来,定义具体的状态类,这里定义了两个具体状态类,分别代表电视开机状态和电视关机状态:csharpCopycodepublicclassTvOnState:ITvState{publicvoidTurnOn(){Console。WriteLine(电视已经开机);}publicvoidTurnOff(){Console。WriteLine(电视关机);}publicvoidNextChannel(){Console。WriteLine(下一个频道);}publicvoidPrevChannel(){Console。WriteLine(上一个频道);}}publicclassTvOffState:ITvState{publicvoidTurnOn(){Console。WriteLine(电视开机);}publicvoidTurnOff(){Console。WriteLine(电视已经关机);}publicvoidNextChannel(){Console。WriteLine(电视已经关机,无法切换频道);}publicvoidPrevChannel(){Console。WriteLine(电视已经关机,无法切换频道);}}
  最后,定义上下文类,它包含了当前电视的状态,并提供了一些接口供外界使用:csharpCopycodepublicclassTvContext{privateITvStatestate;publicTvContext(){statenewTvOffState();}publicvoidSetState(ITvStatestate){this。statestate;}publicvoidTurnOn(){state。TurnOn();SetState(newTvOnState());}publicvoidTurnOff(){state。TurnOff();SetState(newTvOffState());}publicvoidNextChannel(){state。NextChannel();}publicvoidPrevChannel(){state。PrevChannel();}}
  现在,我们就可以使用上下文类来操作电视遥控器了,例如:csharpCopycodeTvContextcontextnewTvContext();context。TurnOn();context。NextChannel();context。NextChannel();context。PrevChannel();context。TurnOff();
  输出结果为:Copycode电视开机下一个频道下一个频道上一个频道电视关机策略模式(StrategyPattern)
  策略模式(StrategyPattern)是一种行为设计模式,它允许在运行时选择算法的行为。该模式定义了一组算法,将每个算法封装起来,并使它们之间可以相互替换。
  下面是使用C实现策略模式的示例代码:csharpCopycode抽象策略publicinterfaceIStrategy{voidExecute();}具体策略publicclassConcreteStrategyA:IStrategy{publicvoidExecute(){Console。WriteLine(执行策略A);}}具体策略publicclassConcreteStrategyB:IStrategy{publicvoidExecute(){Console。WriteLine(执行策略B);}}上下文publicclassContext{privateIStrategystrategy;publicContext(IStrategystrategy){strategystrategy;}publicvoidSetStrategy(IStrategystrategy){strategystrategy;}publicvoidExecuteStrategy(){strategy。Execute();}}客户端代码publicclassClient{publicstaticvoidMain(){创建上下文并设置初始策略ContextcontextnewContext(newConcreteStrategyA());执行策略Acontext。ExecuteStrategy();切换策略context。SetStrategy(newConcreteStrategyB());执行策略Bcontext。ExecuteStrategy();}}
  在这个示例中,IStrategy是抽象策略,定义了策略的接口。ConcreteStrategyA和ConcreteStrategyB是具体策略,实现了策略接口。Context是上下文,维护了一个策略对象,并且提供了一些方法来使用该策略。Client是客户端代码,使用上下文对象来执行策略。在客户端代码中,我们首先创建了一个上下文对象并设置了一个初始策略。然后我们执行了策略A,接着我们切换了策略并执行了策略B。模板方法模式(TemplateMethodPattern)
  在模板方法模式中,有一个抽象类定义了一些抽象的方法和模板方法,模板方法是一个固定的算法流程,而抽象的方法则需要子类去实现。模板方法模式的目的是让子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  下面是一个简单的示例代码:csharpCopycodeusingSystem;abstractclassAbstractClass{publicvoidTemplateMethod(){Operation1();Operation2();}publicabstractvoidOperation1();publicabstractvoidOperation2();}classConcreteClassA:AbstractClass{publicoverridevoidOperation1(){Console。WriteLine(ConcreteClassA。Operation1);}publicoverridevoidOperation2(){Console。WriteLine(ConcreteClassA。Operation2);}}classConcreteClassB:AbstractClass{publicoverridevoidOperation1(){Console。WriteLine(ConcreteClassB。Operation1);}publicoverridevoidOperation2(){Console。WriteLine(ConcreteClassB。Operation2);}}classProgram{staticvoidMain(string〔〕args){AbstractClassc1newConcreteClassA();AbstractClassc2newConcreteClassB();c1。TemplateMethod();c2。TemplateMethod();Console。ReadKey();}}
  在上面的代码中,AbstractClass是一个抽象类,它有一个TemplateMethod方法,该方法调用了两个抽象方法Operation1和Operation2。具体的子类ConcreteClassA和ConcreteClassB分别实现了这两个抽象方法,并且可以在模板方法中按照特定的流程调用它们。
  当我们运行这个程序时,输出如下:CopycodeConcreteClassA。Operation1ConcreteClassA。Operation2ConcreteClassB。Operation1ConcreteClassB。Operation2
  这表明模板方法模式确实在两个具体的子类中分别执行了它们的Operation1和Operation2方法,但是并没有改变模板方法的算法流程。访问者模式(VisitorPattern)
  访问者模式(VisitorPattern)是一种行为型设计模式,它允许你定义算法(访问者),并将其与一组对象分离。访问者模式最常见的应用场景是在对象结构比较稳定的情况下,需要对对象结构中的对象进行各种不同的操作,且经常添加新的操作。
  下面是一个使用访问者模式的示例代码:csharpCopycodeusingSystem;usingSystem。Collections。Generic;访问者接口interfaceIVisitor{voidVisit(ConcreteElementAelementA);voidVisit(ConcreteElementBelementB);}抽象元素类abstractclassElement{publicabstractvoidAccept(IVisitorvisitor);}具体元素类AclassConcreteElementA:Element{publicoverridevoidAccept(IVisitorvisitor){visitor。Visit(this);}publicvoidOperationA(){Console。WriteLine(ConcreteElementA。OperationA());}}具体元素类BclassConcreteElementB:Element{publicoverridevoidAccept(IVisitorvisitor){visitor。Visit(this);}publicvoidOperationB(){Console。WriteLine(ConcreteElementB。OperationB());}}具体访问者类classConcreteVisitor:IVisitor{publicvoidVisit(ConcreteElementAelementA){elementA。OperationA();}publicvoidVisit(ConcreteElementBelementB){elementB。OperationB();}}对象结构类classObjectStructure{privateListElementelementsnewListElement();publicvoidAttach(Elementelement){elements。Add(element);}publicvoidDetach(Elementelement){elements。Remove(element);}publicvoidAccept(IVisitorvisitor){foreach(Elementelementinelements){element。Accept(visitor);}}}客户端代码classClient{staticvoidMain(){ObjectStructureobjectStructurenewObjectStructure();objectStructure。Attach(newConcreteElementA());objectStructure。Attach(newConcreteElementB());ConcreteVisitorvisitornewConcreteVisitor();objectStructure。Accept(visitor);Console。ReadKey();}}
  在上面的示例中,IVisitor定义了访问者的接口,包含了对每个具体元素类的访问方法。Element是抽象元素类,定义了Accept方法,接受访问者的访问。ConcreteElementA和ConcreteElementB是具体元素类,实现了Accept方法,并且定义了各自的操作方法。ConcreteVisitor是具体访问者类,实现了IVisitor接口,实现了对每个具体元素的操作。ObjectStructure是对象结构类,包含了元素对象集合,并提供了Accept方法,接受访问者的访问。客户端代码通过创建ObjectStructure对象,向其中添加具体元素对象,并创建ConcreteVisitor对象进行访问操作。
  文章来源于token的技术分享,作者tokengo
  token的技术分享。
  分享。NET生态技术,和。NET相关知识

请问,你们有没有去找当地有名的算命先生算过命,觉得准吗?人的命天注定,算来算去没有用,好的不来赖的必应!尽量别算自己的命运,人活一辈子顺其自然最好!自古一来大家都喜欢算命,自己的命运掌握在一个算命人手里究竟究竟该不该听,信还是不信。一个我今年44岁,交的养老保险是灵活就业20年,是继续交还是停止?答不知道题主是男是女,但无论是男是女,44岁都不够法定的退休年龄。特别是灵活就业身份交的社保,距离退休时间比职工身份交社保的时间还要长。因为,灵活就业身份交社保的法定退休年龄是男6天津清理户口是真是假?天津清户不是这几天的事,已经持续有一段时间了,不过是分阶段分重点的2021年第二季度和第三季度清理的主要是造假人员,比如提供假学历假职称办理的落户2021年第四季度和2022年第一你去火葬场送别过亲人吗?那一刻你想了些什么?火化场,我去过7次,我父亲,我二叔,我三叔,四叔四婶,我姥姥和我表哥,这几个人除了我父亲以外,其他几个人从生病开始,我都去探望好几次,去世去火化到下葬,我全部在场。要说火葬场,不去厦门大学和东南大学怎么选?综合实力谁更强一些?把这两所大学放在一起比,似乎显得有些不伦不类,因为这是两所完全性质不一样的大学。我厦门生活过四年,厦大最少也去过十多次。现在又生活在南京,东南大学也去过若干次。要想用一句两句话把这福州大学南昌大学郑州大学,哪个更好?福州大学,教育部国防科工委和福建省共建高校,211高校。福州大学位于福州市,以理工科学科为主,以土木工程数学化学管理科学与工程电气工程机械工程材料科学与工程为特色学科,其中化学为双为什么一些大学生不好找工作?作为一名在校生,仅从三个方面发表一下自己的观点。人数我国近几年的高校毕业生已达到七百多万,并且都在逐年增加,大学生这个身份已经在逐年贬值,就业竞争本就很激烈。再加上前些年没有找到工江苏省养老金计发基数统一7974元,本省退休人员也全拉平了吗?基数隔年的平均工资耶。不是每个退休人员的养老金都是这样的。还是有差别的。算好自己的就是了。一部分友友叮着养老金不切实的。衡量一下干了多少年。单位缴了多少(最低还是厂内职工平均。年份为什么今日头条里面的退休人员的养老金都这么高?感谢邀请,更感谢楼主的提问。楼主你好,为什么头条里面的退休人员,养老金都这么高呢?其实我认为这没有什么必要去怀疑他的,当然有的人他可能仅仅只提供了一句话,没有任何的图片作为附加。可请问上海志愿者有什么福利吗?谢邀!上海志愿者有什么福利吗?尤其新冠疫情发生以来,志愿者更是成为了人们目光的焦点。作为一个从学生时代就开始在上海做志愿者的普通外地人,跟大家说说我自己的亲身经历以及了解的志愿者福已经4050岁了,从来没参加过社保,还可以交吗?是这样的,如果已经是四五十岁的年龄了,仍然是可以去缴纳社保的,时间上并不晚。尤其是你现在是40岁的话,缴满15年后,也就是55岁,对于女性来说正好是可以领取养老金了。即便你已经是5
进入游牧时光(12)有人为他写了一首歌,歌名在游荡上期写了七十岁拿驾照开着房车进西藏的大叔,我家老猫似乎也被此事触动了,昨晚主动要求到驻地去,今天一大早就跟大叔聊上了。大叔给他打气不管做什么事,首先不要怕。就拿进藏来说,我们就是摸国产闪存受阻,三星立马涨价,为何总有一些人要贬自主品牌?还在说是国产品牌在拉高手机的价格吗?长江存储刚刚受限,三星立马就涨价。华为受限这三年来,高通骁龙芯片,从55美元,涨到了现在190美元,三年前,小米9还是2千多,三年后的今天,小米比亚迪官宣涨价,特斯拉却在降价,新能源车市现抢单行情!车企直面降本考验岁末年关,国家新能源汽车补贴(简称国补)退坡也进入最后的窗口期。限时保价锁单优惠已成为多数车企吸引消费者的常规操作。近日,证券时报e公司记者走访了沪上多家新能源汽车直营门店,一些厂多地网点瘫痪,快递堆积如山接近年关,快递业正在遭受着前所未有的挑战。做了五年快递,这种情况第一次见,整个网点完全瘫痪,仓库哪哪都是快递,比双十一堆得还多,根本没有人手。安徽某通达系网点加盟商杨厉感叹道。杨厉都说通信方式改变世界,为什么商用3年,却感觉5G没有什么作用?通信,这是一个释义宽泛的中文名词,也是一个由古及今的动词,简单来说,就是这个词语既可以概括整个通信行业,同时也能够代指通信的行为。比如由唐代文学家李德裕所著散文代刘沔与回鹘宰相书意安仁县猴昙仙村三好兴人才激活乡村发展新动能红网时刻新闻12月22日讯(通讯员赵志武龙叶红)近年来,安仁县猴昙仙村以三好措施兴人才为工作要领,为推进乡村振兴示范创建提升基层治理效能注入了源头活水,使村集体经济由5万元增长至4成年人的断交方式成年人的断交,都是静悄悄的。仿佛成年人的感情都是易碎品,经不起时间和空间的考验。成年人的告别仪式也非常简单,我没有回你最后一条信息,你也很默契地没有再发。有些人走着走着就会走丢了,东方日出满眼春中央彩票公益金支持下的乡村振兴示范村建设红网时刻通讯员向良喜报道冬日的朝阳照在东旺坪村大片大片的油菜田里,迅速地融化着薄薄的一层白霜,三个一群五个一伙的游人穿行在腾腾的雾气中。这里是湖南省张家界市桑植县瑞塔铺镇东旺坪村,一个乡村的文化礼堂(一线调研)(图浙江杭州临安区板桥镇上田村文化礼堂。章勇涛摄)(图上田村文化礼堂,村民们在交流书法心得。章勇涛摄)(上田村村景。章勇涛摄)核心阅读浙江省杭州市临安区板桥镇上田村,建成了浙江第一从乡村爱情中消失的演员6位去世,7位被换,1位刚出狱刘老根5开播了,不少观众看完后直呼越来越像乡村爱情了,剧中虽说几乎是原班人马的重聚,但却是少了原来的味道,恰如已经拍了16年的乡村爱情一样,回想央视第一次首播乡村爱情时,观众们早早EMPHASIS艾斐诗节日系列珠宝拉开派对帷幕,CANADAGOOSEPastels系列打造柔和冬日是日美好事物记者罗以文编辑楼婍沁EMPHASIS艾斐诗节日系列珠宝拉开派对帷幕节日季即将来临,EMPHASIS艾斐诗珠宝化作音符奏响节日序曲,拉开派对的帷幕。EMPHASIS艾斐诗Sympho
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网