欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    经典文档-C#23种设计模式.pdf

    • 资源ID:88909935       资源大小:23.81MB        全文页数:241页
    • 资源格式: PDF        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    经典文档-C#23种设计模式.pdf

    c#23种设计模式China Document 4 Colors1.1 节 工 期How are you1.1.1 完成日期1.2 节 创 建 型 模 式1.21 单件模式(Singleton Pattern)动 机(M otiva tion):在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?这应该是类设计者的责任,而不是类使用者的责任。结构图:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。-GOF生活的例子:返回唯一实例适用性:(1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。(2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现:(1)单线程S ingleton实现class SingleThread_Singleton(private static SingleThread_Singleton instance=null;private SingleThread_Singleton()public static SingleThread_Singleton I nstance(get(if(instance=null)(instance=new SingleThread_Singleton();)return instance;)以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到if(instance=null)判断是否被实例化,一个线程判断为True后,在进行创建instance=new SingleThread_Singleton();之前,另一个线程也判断(instance=n u ll),结果也为 True.这样就就违背了 Singleton模式的原则(保证一个类仅有一个实例)。怎样在多线程情况下实现Singleton?(2)多 线 程Singleton实现:1 class MultiThread_Singleton2 3 private static volatile MultiThread_Singleton instance=null;4 private static object lockHelper=new object();5 private MultiThread_Singleton()6 public static MultiThread_Singleton Instance7(8 get9(10 if(instance=null)11(1 2 lock(lockHelper)13 14 if(instance=null)15 1 6 instance=new MultiThread_Singleton();17)18)19)20 return instance;21)22)23此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果 instance 为空,保证只 有 一 -个线程 instance=new MultiThread_Singleton();创建唯一的一个实例)。(Double Check)请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。volatile保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态S ingleton实现3 class Static_Singleton4(5 publicstatic readonly Static_Singleton instance=new Static_Singleton();6 private Static_Singleton()7)DirectorBuilderO+Construct()-BuildPart)一Fetch Item In Structurebuild.BuildPanOConcreteBuilder-BuildPartf)-GctRcsultOC ollaborations):aClientaDirectoraConcreteBuilder生活中的例子:M赛工厂”3)适用性:1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2.当构造过程必须允许被构造的对象有不同的表示时。实例代码:Builder 类:1 public abstract class Builder2(3 public abstract void BuildDoor();4 public abstract void BuildWall();5 public abstract void BuildWindows();6 public abstract void BuildFloor();7 public abstract void BuildHouseCeiling();89 public abstract House GetHouse();10)Director类:这一部分是 组合到一起的算法(相对稳定)。1 public class Director2(3 public void Construct(Builder builder)4(5 builder.BuildWall();6 builder.BuildHouseCeiling();7 builder.BuildDoor();8 builder.BuildWindows();9 builder.BuildFloor();10)11)ChineseBuilder 类1 public class ChineseBuilder:Builder2(3 private House ChineseHouse=new House();4 public override void BuildDoor()5 6Console.WriteLine(this Doors style of Chinese);7 8 public override void BuildWall()9 1 0 Console.WriteLine(this Walls style of Chinese);11)1 2 public override void BuildWindows()13 14 Console.WriteLine(this Windowss style of Chinese);15)1 6 public override void BuildFloor()17 1 8 Console.WriteLine(this Roor s style of Chinese11);19)20 public override void BuildHouseCeiling()21 22 Console.WriteLine(this Ceilings style of Chinese);23)24 public override House GetHouse()25 26 return ChineseHouse;27)28)RomanBuilder 类:1 class RomanBuilder:Builder2(3 private House RomanHouse=new House();4 public override void BuildDoor()5 6 Console.WriteLine(this Doors style of Roman);7)8 public override void BuildWall()9 10 Console.WriteLine(this Walls style of Roman);11)1 2 public override void BuildWindows()13 14 Console.WriteLine(this Windowss style of Roman);15)1 6 public override void BuildFloor()17 18 Console.WriteLine(this Floor s style of Roman);19)20 public override void BuildHouseCeiling()21 Console.WriteLine(this Ceilings style of Roman);23)24 public override House GetHouse()25 26 return RomanHouse;27)28)ChineseBuilder利RomanBuilder这 两 个 是:这个复杂对象的两个部分经常面临着剧烈的变化。1 public class Client2(3 public static void Main(string args)4 5 Director director=new Director();67 Builder instance;89 Console.WriteLine(Please Enter House No:);1011 string No=Console.ReadLine();1213 string houseType=Configurationsettings.AppSettingsHNoH+No;1415 instance=(Builder)Assem bly.Load(House).Createlnstance(House.+houseType);161 7 director.Construct(instance);1819 House house=instance.GetHouse();20 house.Show();2122 Console.ReadLine();23)24)1 2 3 4 5 6 7 B uilder模式的几个要点:B uilder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的乘法,而复杂对象的各个部分则经常变化。B uilder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。Abstract Factory模式解决“系列对象”的需求变化,B uilder模式解决“对象部分”的需求变化。Builder械通常和Composite模式组合使用1.24 工厂方法模式(Factory Method)耦合关系:耦合关系直接决定着软件面对变化时的行为-模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改-模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变动机(M otivation):在软件系统中,由于需求的变化,这个对象的具体实现 经常面临着剧烈的变化,但它却有比较稳定的接口。如何应对这种变化呢?提供一种封装机制来隔离出“这个易变对象 的变化,从而保持系统中其它依赖的对象”不随需求的变化而变化。意图(I ntent):定义一个用户创建对象的接口,让子类决定实例哪一个类。Factory Method使 个 类 的 实例化延迟到子类。.设计模式GOF结构图(S truct):生活实例:注入S B造SA 0玩具马模具适用性:1.当一个类不知道它所必须创建的对象类的时候。2 当一个类希望由它子类来指定它所创建对象的时候。3.当类将创建对象的职责委托给多个帮助子类中的某个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。实例代码:CarFactory 类:1 public abstract class CarFactory2 3 public abstract Car CarCreate();4)Car 类:1 public abstract class Car2 3 public abstract void StartUpO;4 public abstract void Run();5 public abstract void Stop();67)HongQiCarFactory 类:1 public class HongQiCarFactory:CarFactory2 3public override Car CarCreate()4(5 return new HongQiCar();6)7)BMWCarFactory 类:1 public class BMWCarFactory:Car Factory2 3 public override Car CarCreate()4(5 return new BMWCar();6)7)HongQiCar 类:1 public class HongQiCar:Car2 3 public override void StartUp()4 5 Console.WriteLine(Test HongQiCar start-up speed!);6)7 public override void Run()8 9 Console.WriteLine(The HongQiCar run is very quickly!);10)11 public override void Stop()12 13 Console.WriteLine(The slow stop time is 3 second);14)15 BMWCar 类:1 public class BMWCar:Car2(3 public override void StartUp()45Console.WriteLine(HThe BMWCar start-up speed is very quickly);6)7 public override void Run()8(9 Console.WriteLine(The BMWCar run is quitely fast and safe!);10)11 public override void Stop()12 13 Con sole.WriteLine(The slow stop time is 2 second);14)15)app.config1 2 3 4 5 6 7 Program 类:1 class Program2 3 static void Main(string args)4 5 Console.WriteLine(nPlease Enter Factory Method No:);6 Console.WriteLine(n*);7 Console.WriteLine(HnoConsole.WriteLine(n19 Console.WriteLine(210 Console.WriteLine(n*11 int no=I nt32.Parse(Co12 string factoryType=Co13/CarFactory factory=14 CarFactory factory=(Factory Method);HongQi CarFactory);BMWCarFactory);it*nsole.ReadLine().ToString();nfigurationManager.AppSettingsNonew HongQiCarFactory();Ca r Fact o ry)Asse m bl y.Lo ad(Fact oryM(eatelnstance(FactoryMehtod.+factoryType);15 Car car=factory.CarCreate();16 car.StartUp();17 car.Run();18 car.Stop();1920)21)Factory M ethod模式的几个要点:Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。Factory Mehtod模式解决“单个对象”的需求变化,AbstractFactory模式解决“系歹U对象”的需求变化,Builder模式解决,对象部分”的需求变化1.25 原型模式(Prototype)依赖关系倒置:抽象不应该依赖于实现细节,实现细节应该依赖于抽象。-抽象A直接依赖于实现细节b-抽象A依赖于抽象B,实现细节b依赖于抽象BI-777)抽象A 实现细节b抽象B实现细节b动机(Motivate):在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?意图(I nt e nt):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。-设计模式G O F结构图(S t r u c t):生活例子:适用性:1.当一个系统应该独立于它的产品创建,构成和表示时;2.当要实例化的类是在运行时刻指定时,例如,通过动态装载;3.为了避免创建一个与产品类层次平行的工厂类层次时;4 .当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。示意性代码例子:1 public abstract class NormalActor2 3 public abstract NormalActor clone();4)1 public class NormalActorA:NormalActor2(3 public override NormalActor clone()4 5 Console.WriteLine(NormalActorA is call);6 return(Norm al Actor)this.Mem berwiseClone();78)9)1 public class NormalActorB:NormalActor2(3 public override NormalActor clone()4 5 Console.Writ eLine(H Norm al ActorB was called);6 return(NormalActor)this.MemberwiseClone();78)9)public class GameSystempublic void Run(NormalActor normalActor)NormalActor normalActorl=normalActor.clone();NormalActor normalActor2=normalActor.clone();NormalActor normalActor3=normalActor.clone();NormalActor normalActor4=normalActor.clone();NormalActor normalActor5=normalActor.clone();)classProgramstatic void Main(string args)(GameSystem gameSystem=new GameSystem();g am eSy stem.Ru n(n ew NormalActorA();)如果又需要创建新的对象(flyActor),只需创建此抽象类,然后具体类进行克隆。public abstract class FlyActor(public abstract Ry Act or clone();)public class FlyActorB:FlyActorIII/浅拷贝,如果用深拷贝,可使用序列化/public override Fly Actor clone()return(FlyActor)this.MemberwiseCIone();)此时,调用的Main()函数只需如下:classProgram(static void Main(string args)(GameSystem gameSystem=new GameSystem();gam eSy stem.Run(new NormalActorA(),new FlyActorB();)Prototype的几个要点:Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类 拥有“稳定的接口”。Prototype模式对于“如何创建易变类的实体对象“采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口中”的新对象一一所需工作仅仅是注册的地方不断地Clone.Prototype模式中的Clone方法可以利用.net中的object类的memberwiseClone()方法或者序列化来实现深拷贝。有关创建型模式的讨论:Singleton模式解决的是实体对象个数的问题。除了 Singleton之外,其他创建型模式解决的是都是new所带来的耦合关系。Factory Method.Abstract Factory,Builder 都需要一个额外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。如果遇至易变类”,起初的设计通常从Factory Mehtod开始,当遇到更多的复杂变化时,再考虑重重构为其他三种工厂模式(AbstractFactory,Builder,Prototype)适 配 器 模 式(Adapter Pattern)适配(转换)的概念无处不在.适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。例如:二转换为三箱插头,将高电压转换为低电压等。动机(M o t i v a t e):在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter模式。意图(I n t e n t):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。设计模式G 0 F结构(S t r u c t):图1:对象适配器 I n t e r f a c e 图2:类适配器生活中的例子:适用性:1.系统需要使用现有的类,而此类的接口不符合系统的需要。2.想要建立一 个 可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。3.(对对象适配器而言)在设计里,需要改变多个己有子类的接I I,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。示意性代码实例:1 interface I Stack2 3 void Push(object item);4 void Pop();5 object Peek();6)1 对象适配器(Adapter与Adaptee组合的关系)2 public class Adapter:I Stack/适配对象3 4 ArrayList adaptee;被适配的对象5 public Adapter()6 7 adaptee=new ArrayList();8)9 public void Push(object item)10 11 adaptee.Add(item);12)13 public void Pop()14 15 adaptee.RemoveAt(adaptee.Count-1);16)17 public object Peek()18 19 return adapteeadaptee.Count-1 ;20)21)类适配器1 public class Adapter:ArrayList,I Stack2(3 public void Push(object item)4(5 this.Add(item);6)7 public void Pop()8 9 this.RemoveAt(this.Count-1);10)11 public object Peek()12 13 return thisthis.Count-1;14)15)Adapter模式的几个要点:Adapter模式主要应用于“希望复用一些现存的类,但是接口又与第用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。GOF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。Adapter模式可以实现的非常灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象“作为新的接口方法参数,来达到适配的目的。Adapter模式本身要求我们尽可能地使用”面向接口的编程”风格,这样才能在后期很方便的适配。.NET框架中的Adapter应用:在.N et中复用com对象:Com对象不符合.n e t对象的接口使用 tlbimp.exe 来创建一个 Runtime Callable Wrapper(RCW)以使其符合.net对象的接口。(2).NET数据访问类(Adapter变 体):各种数据库并没有提供DataSet接口使用DBDataAdapter可以将任何各数据库访问/存取适配到一个DataSet对象上。(3)集合类中对现有对象的排序(Adapter变 体);现有对象未实现IC o m p ar ab l e接口实现一个排序适配器(继承【C o m p ar e r接 口),然后在其C o m p ar e方法中对两个对象进行比较。桥 接 模 式(Bridge Pattern)动机(Motivate):在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?意图(In t e n t):将抽象部分与实现部分分离,使它们都可以独立的变化。-设计模式G 0 F结构图(S t r u c t):生活中的例子:我想大家小时候都有用蜡笔画画的经历吧。红红绿绿的蜡笔一大盒,根据想象描绘出格式图样。而毛笔下的国画更是工笔写意,各展风采。而今天我们的故事从蜡笔与毛笔说起。设想要绘制一幅图画,蓝天、白云、绿树、小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦。毕竟细细的蜡笔要涂出片蓝天,是有些麻烦。如果有可能,最好有套大号蜡笔,粗粗的蟒笔很快能涂抹完成。至于色彩吗,最好每种颜色来支粗的,除了蓝天还有绿地呢。这样,如 果 套12种颜色的蜡笔,我们需要两套24支,同种颜色的粗细。呵呵,画还没画,开始做梦了:要是再有一套中号蜡笔就更好了,这样,不多不少总共36支蜡笔。再看看毛笔这一边,居然如此简陋:套水彩12色,外加大中小三支毛笔。你可别小瞧这简陋”的组合,画蓝天用大毛笔,画小鸟用小毛笔,各具特色。呵呵,您是不是已经看出来了,不错,我今天要说的就是Bridge模式。为了一幅画,我们需要准备36支型号不同的蜡笔,而改用毛笔三支就够了,当然还要搭配上12种颜料。通过Bridge模式,我们把乘法运算3x 1 2=36改为了加法运算3+1 2=1 5,这一改进可不小。那么我们这里蜡笔和毛笔到底有什么区别呢?实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。GOF95】桥梁模式的用意是将抽象化(Abstraction)与实现化(Im pl ementation)脱耦,使得二者可以独立地变化。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不开的,所以就造成必须使用36支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是:毛笔用颜料作画,而在实现时,毛笔有大中小三号,颜料有红绿蓝 等12利 J 于是便可出现3x 12种组合。每个参与者(毛笔与颜料)都可以在自己的自由度上随意转换。蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建36种对象才能完成任务。Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。代码实现:123456781234512345123412abstract class Brush(protected Color c;public abstract void Paint();public void SetColor(Color c)this.c=c;)class BigBrush:Brush(public override void Paint()Console.WriteLine(uUsing big brush and color 0 painting*,c.color);)class SmallBrush:Brush|public override void Paint()Console.WriteLine(Using small brush and color 0 painting,c.color);)class Color(public string color;)class Red:Color3451234512345123456789101112131415161718public Red()this.color=red;)class Green:Color(public Green()this.color=green;class Blue:Color(public Blue()this.color=blue;)class Program(public static void Main()(Brush b=new BigBrush();b.SetColor(new Red();b.Paint();b.SetColor(new Blue();b.Paint();b.SetColor(new Green();b.Paint();b=new SmallBrush();b.SetColor(new Red();b.Paint();b.SetColor(new Blue();b.Paint();b.SetColor(new Green();19 b.Paint();20 适用性:1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。Bridge 要点:1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同平台上的不同型号。3.Bridge模式有时候类似乎多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。装饰模式(Decorator Pattern)子类复子类,子类何其多假如我们需要为游戏中开发种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能;比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等。按类继承的作法如下:1 抽象坦克2 public abstract class Tank34 public abstract void Shot();5 public abstract void Run();6)各种型号:1 /T 5 0型号2 public class T50:Tank3(4 public override void Shot()5(6 Console.WriteLine(T50坦克平均每秒射击5发子弹);7 8 public override void Run()9 10 Console.WriteLine(T50坦克平均每时运行3 0公里);11)12 1 /T 7 5型号2 public class T75:Tank3 4 public override void Shot()5 6 Console.WriteLine(T75坦克平均每秒射击1 0发子弹);7)8 public override void Run()9 10 Console.WriteLine(T75坦克平均每时运行3 5公里);11)12 1 /T 9 0型号2 public class T90:Tank3 4 public override void Shot()5 6 Console.WriteLine(T90坦克平均每秒射击1 0发子弹);7)8 public override void Run()9 1 0 Console.WriteLine(T90坦克平均每时运行40公里);11)12 各种不同功能的组合:比如IA具有红外功能接口、IB具有水陆两栖功能接口、IC具有卫星定位功能接口。1 /T50坦克各种功能的组合2 public class T50A:T50,l A3 4 具有红外功能5)6 public class T50B:T50,l B7 8 具有水陆两栖功能9)10 public class T50C:T50,IC11 1213)14 public class T50AB:T50,l A,l B15)18 public class T50AC:T50,l A,IC19)20 public class T50BC:T50,l B,IC21)22 public class T50ABC:T50,l A,l B,IC23)123456789101112131415161718192021222324252627282930123/T75各种不同型号坦克各种功能的组合public class T75A:T75,I A具有红外功能public class T75B:T75,IB(具有水陆两栖功能public class T75C:T75,IC(具有卫星定位功能)public class T75AB:T75,I A,l B(具有红外、水陆两栖功能public class T75AC:T75,I A,IC(具有红外、卫星定位功能public class T75BC:T75,I B,IC(具有水陆两栖、卫星定位功能public class T75ABC:T75,I A,l B,l C(具有红外、水陆两栖、卫星定位功能/T90各种不同型号坦克各种功能的组合public class T90A:T90,l A4(5 具有红外功能6)7 public class T90B:T90,l B8 9 具有水陆两栖功能10)11 public class T90C:T90,IC12 13 具有卫星定位功能14)15 public class T90AB:T90,l A,l B16 17 具有红外、水陆两栖功能181 9 public class T90AC:T90,l A,IC20 21 具有红外、卫星定位功

    注意事项

    本文(经典文档-C#23种设计模式.pdf)为本站会员(文***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开