《23种设计模式_UML_类图.docx》由会员分享,可在线阅读,更多相关《23种设计模式_UML_类图.docx(57页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 23种设计模式 UML 类图及对应示例代码 (一)收藏1.DoFactory.GangOfFour.Abstract.Structural Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。usingSystem;namespaceDoFactory.GangOfFour.Abstract.Structural/MainAppstartupclassfor
2、Structural/AbstractFactoryDesignPattern./classMainApp/Entrypointintoconsoleapplication./publicstaticvoidMain()/Abstractfactory#1AbstractFactoryfactory1=newConcreteFactory1();Clientclient1=newClient(factory1);client1.Run();/Abstractfactory#2AbstractFactoryfactory2=newConcreteFactory2();Clientclient2=
3、newClient(factory2);client2.Run();/WaitforuserinputConsole.Read();/AbstractFactoryabstractclassAbstractFactorypublicabstractAbstractProductACreateProductA();publicabstractAbstractProductBCreateProductB();/ConcreteFactory1classConcreteFactory1:AbstractFactorypublicoverrideAbstractProductACreateProduc
4、tA()returnnewProductA1();publicoverrideAbstractProductBCreateProductB()returnnewProductB1();/ConcreteFactory2classConcreteFactory2:AbstractFactorypublicoverrideAbstractProductACreateProductA()returnnewProductA2();publicoverrideAbstractProductBCreateProductB()returnnewProductB2();/AbstractProductAabs
5、tractclassAbstractProductA/AbstractProductBabstractclassAbstractProductBpublicabstractvoidInteract(AbstractProductAa);/ProductA1classProductA1:AbstractProductA/ProductB1classProductB1:AbstractProductBpublicoverridevoidInteract(AbstractProductAa)Console.WriteLine(this.GetType().Name+interactswith+a.G
6、etType().Name);/ProductA2classProductA2:AbstractProductA/ProductB2classProductB2:AbstractProductBpublicoverridevoidInteract(AbstractProductAa)Console.WriteLine(this.GetType().Name+interactswith+a.GetType().Name);/Client-theinteractionenvironmentoftheproductsclassClientprivateAbstractProductAAbstract
7、ProductA;privateAbstractProductBAbstractProductB;/ConstructorpublicClient(AbstractFactoryfactory)AbstractProductB=factory.CreateProductB();AbstractProductA=factory.CreateProductA();publicvoidRun()AbstractProductB.Interact(AbstractProductA);2.DoFactory.GangOfFour.Adapter.Structural Adapter:将一个类的接口转换成
8、客户希望的另一个接口,使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。usingSystem;namespaceDoFactory.GangOfFour.Adapter.Structural/MainAppstartupclassforStructural/AdapterDesignPattern./classMainApp/Entrypointintoconsoleapplication./staticvoi
9、dMain()/CreateadapterandplacearequestTargettarget=newAdapter();target.Request();/WaitforuserConsole.Read();/TargetclassTargetpublicvirtualvoidRequest()Console.WriteLine(CalledTargetRequest();/AdapterclassAdapter:TargetprivateAdapteeadaptee=newAdaptee();publicoverridevoidRequest()/Possiblydosomeother
10、work/andthencallSpecificRequestadaptee.SpecificRequest();/AdapteeclassAdapteepublicvoidSpecificRequest()Console.WriteLine(CalledSpecificRequest();3.DoFactory.GangOfFour.Bridge.Structural Bridge:将抽象部分与它的实现部分分离,使之可以独立变化。桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承
11、关系,从而使两者可以独立的变化。usingSystem;namespaceDoFactory.GangOfFour.Bridge.Structural/MainAppstartupclassforStructural/BridgeDesignPattern./classMainApp/Entrypointintoconsoleapplication./staticvoidMain()Abstractionab=newRefinedAbstraction();/Setimplementationandcallab.Implementor=newConcreteImplementorA();ab.
12、Operation();/Changeimplementionandcallab.Implementor=newConcreteImplementorB();ab.Operation();/WaitforuserConsole.Read();/AbstractionclassAbstractionprotectedImplementorimplementor;/PropertypublicImplementorImplementorsetimplementor=value;publicvirtualvoidOperation()implementor.Operation();/Implemen
13、torabstractclassImplementorpublicabstractvoidOperation();/RefinedAbstractionclassRefinedAbstraction:AbstractionpublicoverridevoidOperation()implementor.Operation();/ConcreteImplementorAclassConcreteImplementorA:ImplementorpublicoverridevoidOperation()Console.WriteLine(ConcreteImplementorAOperation);
14、/ConcreteImplementorBclassConcreteImplementorB:ImplementorpublicoverridevoidOperation()Console.WriteLine(ConcreteImplementorBOperation);4.DoFactory.GangOfFour.Builder.StructuralBuilder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知
15、道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。usingSystem;usingSystem.Collections;namespaceDoFactory.GangOfFour.Builder.Structural/MainAppstartupclassforReal-World/BuilderDesignPattern./publicclassMainApp/Entrypointintoconsoleapplication./publicstaticvoidMain()/CreatedirectorandbuildersDirectordirector=newDirec
16、tor();Builderb1=newConcreteBuilder1();Builderb2=newConcreteBuilder2();/Constructtwoproductsdirector.Construct(b1);Productp1=b1.GetResult();p1.Show();director.Construct(b2);Productp2=b2.GetResult();p2.Show();/WaitforuserConsole.Read();/DirectorclassDirector/BuilderusesacomplexseriesofstepspublicvoidC
17、onstruct(Builderbuilder)builder.BuildPartA();builder.BuildPartB();/BuilderabstractclassBuilderpublicabstractvoidBuildPartA();publicabstractvoidBuildPartB();publicabstractProductGetResult();/ConcreteBuilder1classConcreteBuilder1:BuilderprivateProductproduct=newProduct();publicoverridevoidBuildPartA()
18、product.Add(PartA);publicoverridevoidBuildPartB()product.Add(PartB);publicoverrideProductGetResult()returnproduct;/ConcreteBuilder2classConcreteBuilder2:BuilderprivateProductproduct=newProduct();publicoverridevoidBuildPartA()product.Add(PartX);publicoverridevoidBuildPartB()product.Add(PartY);publico
19、verrideProductGetResult()returnproduct;/ProductclassProductArrayListparts=newArrayList();publicvoidAdd(stringpart)parts.Add(part);publicvoidShow()Console.WriteLine(nProductParts-);foreach(stringpartinparts)Console.WriteLine(part);5.DoFactory.GangOfFour.Chain.StructuralChain of Responsibility:为解除请求的发
20、送者和接收者之间的耦合,而使多个对象有机会处理这个请求。将这些请求连成一个链,并沿着这条链传递该请求,直到有个对象处理它。责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。usingSystem;namespaceDoFactory.GangOfFour.Chain.Structural/MainAppstartupc
21、lassforStructural/ChainofResponsibilityDesignPattern./classMainApp/Entrypointintoconsoleapplication./staticvoidMain()/SetupChainofResponsibilityHandlerh1=newConcreteHandler1();Handlerh2=newConcreteHandler2();Handlerh3=newConcreteHandler3();h1.SetSuccessor(h2);h2.SetSuccessor(h3);/Generateandprocessr
22、equestintrequests=2,5,14,22,18,3,27,20;foreach(intrequestinrequests)h1.HandleRequest(request);/WaitforuserConsole.Read();/HandlerabstractclassHandlerprotectedHandlersuccessor;publicvoidSetSuccessor(Handlersuccessor)this.successor=successor;publicabstractvoidHandleRequest(intrequest);/ConcreteHandler
23、1classConcreteHandler1:HandlerpublicoverridevoidHandleRequest(intrequest)if(request=0&request=10&request=20&request30)Console.WriteLine(0handledrequest1,this.GetType().Name,request);elseif(successor!=null)successor.HandleRequest(request);6.DoFactory.GangOfFour.Command.StructuralCommand:将一个请求封装为一个对象,
24、从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可以取消的操作。命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。usingSystem;namespaceDoFactory.GangOfFour.Command.Structural/MainAppstartupclassforStructural/CommandD
25、esignPattern./classMainApp/Entrypointintoconsoleapplication./staticvoidMain()/Createreceiver,command,andinvokerReceiverreceiver=newReceiver();Commandcommand=newConcreteCommand(receiver);Invokerinvoker=newInvoker();/Setandexecutecommandinvoker.SetCommand(command);invoker.ExecuteCommand();/Waitforuser
26、Console.Read();/CommandabstractclassCommandprotectedReceiverreceiver;/ConstructorpublicCommand(Receiverreceiver)this.receiver=receiver;publicabstractvoidExecute();/ConcreteCommandclassConcreteCommand:Command/ConstructorpublicConcreteCommand(Receiverreceiver):base(receiver)publicoverridevoidExecute()
27、receiver.Action();/ReceiverclassReceiverpublicvoidAction()Console.WriteLine(CalledReceiver.Action();/InvokerclassInvokerprivateCommandcommand;publicvoidSetCommand(Commandcommand)mand=command;publicvoidExecuteCommand()command.Execute();7.DoFactory.GangOfFour.Composite.StructuralComposite:将对象组合成树形结构以表示“部分整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合
限制150内