《经典文档-C#设计模式.docx》由会员分享,可在线阅读,更多相关《经典文档-C#设计模式.docx(221页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、I C#设计模式(也)4一、C#面向对象程序设计复习5二、设计模式举例5三、先有鸡还是先有蛋?7四、大瓶子套小瓶子还是小瓶子套大瓶子?8C#设计模式(2)11一、”开放一封闭原则(OCP)12二、里氏代换原则(LSP)12C#设计模式(3)19三、依赖倒置原则(DIP)19四、接口隔离原则(| SP)20五、合成/聚合复用原则(CARP)21六、迪米特法则(LoD)22C#设计模式(4)Sim pie Factory Pattern24一、简单工厂(Simpie Factory)模式24二、Sim pie Factory模式角色与结构:24525四、Sim pie Factory 模式演化27
2、五一、点价(盛29C#设计模式(5)Factory Method Pattern30一、工厂方法(Factory Method )模式30二、Factory Method模式角色与结构:30三、程序举例:31五、Factory Method 模式演化34六、Factory Method模式与其它模式的关系35七、另外一个例子35C#设计模式(6)Abstract Factory Pattern38一、抽象工厂(Abstract Factory)模式38二、Abstract Factory 模式的结构:39三、程序举例:41四、在什么情形下使用抽象工厂模式:44五、抽象工厂的起源45六、Abst
3、ract Factory模式在实际系统中的实现46七、”开放一封闭“原贝!J50C#设计模式(7)Singleton Pattern50一、单例(Singleton )模式50二、Singleton模式的结构:51Z2、例I : .51四、在什么情形下使用单例模式:52五、Singleton模式在实际系统中的实现53六、C#中的Singleton模式553# tI-(8) Bu 11d er Patt er n 一、建造者(Builder)模式57二、Builder模式的结构:58三、程序举例:58四、建造者模式的活动序列:62五、建造者模式的实现:62六、建造者模式的演化68七、在什么情况下
4、使用建造者模式69C#设计模式(9)Prototype Pattern70一、原型(Prototype)模式70二、Prototype模式的结构:71三、程序举例:71四、带Prototype Manager的原型模式73五、浅拷贝与深拷贝77六、Prototype模式的优点与缺点79C#设计模式(10)Adapter Pattern80一、适配器(Adapter)模式80二、类的Adapter模式的结构:8I三、类的Adapter模式示意性实现:81四、对象的Adapter模式的结构:83五、对象的Adapter模式示意性实现:84七、一个实际应用Adapter模式的例子85八、关于Adap
5、ter模式的讨论87C#设计模式(11)Com posite Pattern88一、合成(Composite)模式88二、合成模式概述88三、安全式的合成模式的结构8990四、安全式的合成模式实现9094-五、透明式的合成模式结构93六、透明式的合成模式实现94七、使用合成模式时考虑的几个问题97八、和尚的故事9798九、一个实际应用Com posite模式的例子98C#设计模式(12)Decorator Pattern101二、装饰模式的结构101W2四、装饰模式嚏当在什么情况下使用105-W6六、使用装饰模式的优点和缺点110七、模式实现的讨论110444八、透明性的要求111C#设计模式
6、(13)Proxy Pattern113一、代理(Proxy)模式113二、代理的种类114三、远程代理的例子114四、代理模式的结构115五、代理模式示例性代码115/、 117七、不同类型的代理模式118A代理模式实际应用的例子119设计模式(14)Flyweight Pattern122一、享元(Flyweight)模式122二、单纯享元模式的结构122三、单纯享元模式的示意性源代码123四、复合享元模式的结构125五、一个咖啡摊的例子127六、咖啡屋的例子130七、享元模式应当在什么情况下使用133八、享元模式的优点和缺点133434设计模式(15)-Facade Pattern134
7、、门面(Facade)模式134二、门面模式的结构134三、门面模式的实现135四、在什么情况下使用门面模式135五、一个例子136六、使用门面模式的设计140设计模式(16)Bridge Pattern144一、桥梁(Bridge)模式144二、桥梁模式的结构145三、桥梁模式的示意性源代码146四、调制解调器问题149五、另外一个实际应用Bridge模式的例子153六、在什么情况下应当使用桥梁模式158设计模式(17)Chain of Responsibility Pattern158一、职责链(Chain of Responsibility)模式160,、Jxt41!60三、责任链模式的
8、示意性源代码160四、纯的与不纯的责任链模式163五、责任链模式的实际应用案例163六、责任链模式的实现168一、命令(Command)模式168二、命令模式的结构168三、命令模式的中意性源代码169四、玉帝传美猴王上天172五、命令模式的实现172六、命令模式的实际应用案例173七、在什么情况下应当使用命令模式177八、使用命令模式的优点和缺点178设计模式(19)Observer Pattern178一、观察者(Observer)模式178二、观察者模式的结构179三、观察者模式的示意性源代码180五、一个实际应用观察者京式的例子187六、观察者模式的优缺点191设计模式(20)-Vis
9、itor Pattern192.、可(Visitor).192二、访问者模式的结构193二、小意性源代码194四、一个实际应用Visitor模式的例子198五、在什么情况下应当使用访问者模式202六、使用访问者模式的优点和缺点203设计模式(21)Template Method Pattern204一、模板方法(Template Method)模式204二、模版方法模式的结构204三、模板方法模式的示意性代码205四、继承作为复用的工具207五、一个实际应用模板方法的例子208六、模版方法模式中的方法210七、重构的原则211一、策略(Strategy)模式211二、策略模式的结构212二、不
10、意性源代码212四、何时使用何种具体策略角色215五、一个实际应用策略模式的例子215六、在什么情况下应当使用策略模式218七、策略模式的优点和缺点218C#设计模式(1)课本:C#设计模式,电广工业出版社,ISBN 7-5053-8979-3。33元含光盘。课程内容:设计模式来源:亚历山大的建筑模式、Gamma等人(1995)创作的Design Patterns: Elements of Reusable Software.这本书通常被称作Gang of Four或GoF,开创性的创造了设计模式o也有人说三十六计就是模式。一、C#面向对象程序设计复习点击 下载,内容包括:字段与属性.cs属性
11、、方法作用范围.cs一加到一百.cs使用接口排序(2).cs使用接口排序(1).cs求质数.cs冒泡法排序.cs九九表.cs静态与非静态.cs构造函数.cs方法重载.cs多态性.cs递归求阶乘.cs打印三角形.cs传值调用与引用调用.cs二、设计模式举例在设计模式中有一种模式叫Builder模式,其原理如下:我们可以将Builder理解成电饭锅,给这个Builder放进去米和水,经过Builder的Build后,我们就可以取出香喷喷的米饭了。C#中有一个类叫StringBuilder,输入必要的信息后,就可以取出对应的String。其使用方法如下:using System;using Syst
12、em.Text;class Exam日日I public static void Main()点由StringBuilder sb = new StringBuilder();sb.Append(a,2);sb.Append(b,3);sb.Append(c,4);I Console.WriteLine(sb.ToString();打印出 aabbbcccc sb.Remove(0, sb.Length);清除sb 中的所有信息卜L)程序执行结果为:aabbbcccc请使用StringBuilder对以下打印三角型的程序进行改写,写出新程序。using System;public class
13、Exam日叫I public static void Main()白由(I Console.WriteC请输入行数int lines = int.Parse(Console.ReadLine();I Console.WriteLine(,H);for(int i=1; i= lines ; i+)的for(int k=1; k= lines-i; k+)IConsole.Write();I for(int j=1; j= i*2-1; j+)IConsole.Write(*H);I Console. WriteLine(,M,);卜答:using System;using System.Tex
14、t;class Exam日叫I public static void Main()的I Console.Write(”请输入行数:“);int lines = int.Parse(Console.ReadLine();I Console.WriteLine(M);IStringBuilder sb = new StringBuilder();Ifor(int i=1; i= r.getWidth()白由(r.setWidth(r.getWidth()+1);Rectangle-heightJong -width: longgetHeightJong*getWidth:longsetHeight
15、:void setWidth:vodASmartTest区蛆resize:voidSquare 臼-side JonggetHeight:long getS kle: long getWidthJong setHeight:void setSide: void setWidlh:vod在执行SmartTest的resize方法时,如果传入的是长方形对象,当高度大于宽度时,会自动增加宽度直到超出高度。但是如果传入的是正方形对象,则会陷入死循环。代码重构public interface Quadrangle日国public long getWidth();public long getHeight
16、();public class Rectangle : Quadrangle 日国private long width;private long height;Ipublic void setWidth(long width)点由(this.width = width;I public long getWidth()的return this.width;卜public void setHeight(long height)白由(this.height = height;卜public long getHeight()白才(return this.height;卜L)public class S
17、quare : Quadrangle日叫private long side;Ipublic void setSide(long side)由由(this.side = side;卜Ipublic long getSide()的return side;卜II public long getWidth()白由(return getSide();卜)public long getHeight()点中return getSide();卜)SmartTest国 5EEJ A4eth(Rresize: voidW PrupcctKJIntertaceQuadranglegetWidth:long getH
18、eight:long以SquareQ maside:10ng*getHeight:long*getS ide Jong*getWidth:longsetSide: voidRectangleE) F由s-heighclongwidth: long*getHeight:long getWidth:longsetHeight:void 4-setWidth:voidPtwcvaesC#设计模式(3)三、依赖倒置原则(DIP)依赖倒置(Dependence Inversion Principle)原则讲的是:要依赖于,抽象,不要依赖于具体。简单的说,依赖倒置原则要求客户端依赖于抽象耦合。原则表述:抽
19、象不应当依赖于细节;细W应当依赖于抽象;要针对接口编程,不针对实现编程。反面例子:缺点:耦合太紧密,Light发生变化将影响ToggleSwitch。解决办法一:将Light作成Abstract,然后具体类继承自Light.优点:ToggleSwitch依赖于抽象类Light,具有更高的稳定性,而BulbLight与TubeLight 继承自Light,可以根据开放一封闭原则进行扩展。只要Light不发生变化,BulbLight与 TubeLight的变化就不会波及ToggleSwitch。缺点:如果用ToggleSwitch控制一台电视就很困难了。总不能让TV继承自Light吧。解决方法二:
20、优点:更为通用、更为稳定。结论:使用传统过程化程序设计所创建的依赖关系,策略依赖于细节,这是糟糕的,因为策略受到细节改变的影响。依赖倒置原则使细节和策略都依赖于抽象,抽象的稳定性决定了系统的稳定性。四、接口隔离原则(ISP)接口隔离原则(Interface Segregation Principle)讲的是:使用多个专门的接口比使用单一的总接口总要好。换而言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的。过于臃肿的接口是对接口的污染。不应该强迫客户依赖于它们不用的方法。My object-oriented umbrella (摘自 Design Patterns
21、 Explained)Let me tell you about my great umbrella. It is large enough to get into! In fact, three or four other people can get in it with me. While we are in it, staying out of the rain, I can move it from one place to another. It has a stereo system to keep me entertained while I stay dry. Amazing
22、ly enough, it can also condition the air to make it warmer or colder. It is one cool umbrella.My umbrella is convenient. It sits there waiting for me. It has wheels on it so that I do not have to carry it around. I don*t even have to push it because it can propel itself. Sometimes, I will open the t
23、op of my umbrella to let in the sun.(Why I am using my umbrella when it is sunny outside is beyond me!)In Seattle, there are hundreds of thousands of these umbrellas in all kinds of colors. Most people call them cars.实现方法:1、使用委托分离接口2、使用多重继承分离接口五、合成/聚合复用原则(CARP)合成/聚合复用原则(Composite/Aggregate Reuse Pri
24、nciple或CARP)经常又叫做合成复用原则(Composite Reuse Principle或CRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。简而言之,要尽量使用合成/聚合,尽量不要使用继承。o Design to interfaces.o Favor composition over inheritance.o Find what varies and encapsulate it.(摘自:Design Patterns Explained)区分”Has-A”与“Is-A”Is-A”是严格的分类学意义上定义,
25、意思是一个类是另一个类的“一种。而Has-A则不同,它表示某一个角色具有某一项责任。导致错误的使用继承而不是合成/聚合的一个常见的原因是错误的把Has-A”当作Is-A。例如:实际上,雇员、经理、学生描述的是一种角色,比如一个人是经理必然是雇员,另外一个人可能是“学生雇员,在上面的设计中,一个人无法同时拥有多个角色,是雇员就不能再是学生”了,这显然是不合理的。错误源于把角色的等级结构与“人的等级结构混淆起来,误把Has-A当作ls-AL解决办法:六、迪米特法则(LoD)迪米特法则(Law of Demeter或简写LoD)又叫最少知识原则(Least Knowledge Principle 或
26、简写为LKP),也就是说,一个对象应当对其它对象有尽可能少的了解。其它表述:只与你立接的朋友们通信不要跟陌生人说话每一个软件单位对其它的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则与设计模式Facade 模式、Mediator 模式使民无知老子第三章日:”是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲。使被统治的对象“愚昧化,处于无知的状态,可以使统治”的成本降低。所谓最少知识原则,实际上便是老子的使民无知的统治之术。不相往来老子云:小国寡民.邻国相望,鸡犬之声相闻,民至老死,不相往来。将被统治的对象隔离开来,使它们没有直接的通信,可以达到分化瓦解,继而分而
27、治之的效果。迪米特法则与老子的“小国寡民”的统治之术不谋而合。C#设计模式(4)Sim pie Factory Pattern工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态: 筒单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式一、简单工厂(Simple Factory)模式Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。Simple
28、Factory模式实际上不是GoF 23个设计模式中的一员。二、Sim pie Factory模式角色与结构:Create工厂类角色Creator (LightSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。抽象产品角色Product (Light):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。具体产品角色ConcreteProduct (BulbLight, TubeLight):定义工厂具体加工出的对象。三、程序举例:using System;public abstract class Light日日public
29、abstract void TurnOn();public abstract void TurnOff();4public class BulbLight : Light日叫public override void TurnOn()点由(Console.WriteLinefBulb Light is Turned on);卜)Ipublic override void TurnOff()电由Console.WriteLine(Bulb Light is Turned off);卜)4public class TubeLight : Light日叫public override void Tur
30、nOn()小才(Console.WriteLine(Tube Light is Turned on);public override void TurnOff()的Console.WriteLine(Tube Light is Turned off);public class LightSimpleFactory日日public Light Create(string LightType)点由(Iif( LightType =Bulb)return new BulbLight();Ielse if(LightType =Tube”)return new TubeLight();else ret
31、urn null;卜)Lpublic class Client日叫public static void Main()的LightSimpleFactory Isf = new LightSimpleFactory();II Light I = lsf.Create(Bulb);LTurnOn();ILTurnOff();IIConsole.WriteLine(M”);II = lsf.Create(TubeH);LTurnOn();LTurnOff();四、Sim pie Factory模式演化Simple Factory 模式演化(一)除了上面的用法外,在有些情况下Simple Factor
32、y可以由抽象产品角色扮演,一个抽象产品类同时是子类的工厂。程序举例:using System;public class LightEl叫public virtual void TurnOn()由由(public virtual void TurnOff()鼬(public static Light Create(string LightType)鼬if(LightType =Bulb)I return new BulbLight();else if(LightType =Tube)return new TubeLight();elsereturn null;卜)Lpublic class Bu
33、lbLight : Light日叫public override void TurnOn()的Console.WriteLine(nBulb Light is Turned on”);卜)Ipublic override void TurnOff()点由(Console.WriteLine(Bulb Light is Turned off);卜Lpublic class TubeLight : Light日叫public override void TurnOn()的Console.WriteLine(Tube Light is Turned on”);卜Ipublic override void TurnOff()由由Console.WriteLine(Tube Light is Turned off);public class Client 日叫public static void Main()的Light I = Light.Create(BulbM);LTurnOn();I LTurnOff();IConsole.WriteLine(H);III = Light.Create(Tube);I.TurnOn();II.TurnOff();卜)L)Simple Factory 模式演化(二
限制150内