ImageVerifierCode 换一换
格式:DOCX , 页数:39 ,大小:1.33MB ,
资源ID:20472202      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20472202.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(设计模式纵横谈学习笔记Word文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

设计模式纵横谈学习笔记Word文档格式.docx

1、类与对象交互中的职责分配。模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。2、从范围来看:类模式处理类与子类的静态关系。对象模式处理对象间的动态关系。Singleton单件(创建型模式)一、动机(Motivation)特殊类,在系统中只存在一个实例。如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?2、意图(Intent)保证一个类仅有一个实例,并提供一个该实例的全局访问点。3、单线程Singleton模式实现Singleton模式中的实例构造器可以设置为protected以允许子类派生。Singleto

2、n模式一般不要支持ICloneable接口(实例的克隆),因为这可能会导致多个对象实例,与Singleton模式的初衷违背。Singleton模式一般不要支持序列化,因为这也可能导致多个对象实例。Singleton模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。不能应对多线程环境。public class Singleton private static Singleton instance; private Singleton() public static Singleton Instance get if(

3、instance = null) instance = new Singleton(); return instance; 私有的实例构造器是为了屏蔽默认产生的构造器,让类的使用者无法调用构造器。4、多线程Singleton模式实现 public class Singleton private static volatile Singleton instance; private static object lockHelper=new Object(); if(instance=null) lock (lockHelper) if(instance=null)volatile修饰:编译器在编

4、译代码的时候会对代码的顺序进行微调,用volatile修饰保证了严格意义的顺序。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。Abstract Factory抽象工厂(创建型模式)1、new的问题常规的对象创建方法:Road road=new Road();New的问题:实现依赖,不能应对“具体实例化类型”的变化。解决思路:封装变化点哪里变化,封装哪里。面向接口编程依赖接口、而非依赖实现。最简单的解决方法:Class RoadFa

5、ctoryPublic static Road CreateRoad()Return new Road();客户程序:Road road = RoadFactory.CreateRoad();二、如何解决使用面向对象的技术来“封装”变化点。3、动机在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。四、意图提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。5、要点如果没有应多“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂完全可以。“系列对

6、象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。Factory Method工厂方法模式(创建型模式)1、从耦合关系谈起耦合关系直接决定着软件面对变化时的行为模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保

7、持不变。2、动机在软件系统中,经常面临着“某个对象”的创建工作:由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求的改变而改变?3、意图定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。4、要点Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。Factory Method模式通过面向对象的手法,将所要创建的具

8、体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,比较好地解决了这种紧耦合关系。Factory Method模式解决“单个对象”的需求变化,Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。汽车:abstract class AbstractCar public void Startup(); public void Run(); public void Turn(Direction direction); public void Stop();汽车工厂:abstract class CarFactory public abs

9、tract AbstractCar CreateCar(); public class HongqiCarFactory : CarFactory public override AbstractCar CreateCar() return new HongqiCar();红旗汽车:public class Enginee public class HongqiCar:AbstractCar Enginee enginee1; Enginee enginee2; Enginee enginee3; Enginee enginee4; public override void Startup()

10、 public override void Run() public override void Turn(Direction direction) public override void Stop();汽车测试: class CarTestFramework public void BuildTestContext(CarFactory carFactory) AbstractCar c1 = carFactory.CreateCar(); AbstractCar c2 = carFactory.CreateCar(); public void DoTest(AbstractCar car

11、) car.Run(); public TestData GetTestData(AbstractCar car) TestData t = new TestData(); return t;static void Main(string args) CarTestFramework carTestFramework = new CarTestFramework(); carTestFramework.BuildTestContext(new HongqiCarFactory();Builder生成器模式(创建型模式)1、动机在软件系统中,有时候面临着“一个复杂对象”的创建工作,期通常由各个部

12、分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定结构算法”不随着需求的改变而改变?2、意图将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。3、要点Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个比较稳定的算法,而复杂对象的各个部分则经常变化。变化点在哪里,封装哪里Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。A

13、bstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式通常和Composite模式组合使用。 abstract class House public abstract class Builder public abstract void BuildDoor(); public abstract void BuildWall(); public abstract void BuildWindows(); public abstract void BuildFloor(); public abstract void Build

14、HouseCeiling(); public abstract House GetHouse(); public class GameManager public static House CreateHouse(Builder builder) builder.BuildDoor(); builder.BuildDoor(); builder.BuildWindows(); builder.BuildFloor(); builder.BuildWall(); builder.BuildHouseCeiling(); return builder.GetHouse(); public clas

15、s RomainHouse : House public class RomainHouseBuilder : Builder public override void BuildDoor() public override void BuildWall() public override void BuildWindows() public override void BuildFloor() public override void BuildHouseCeiling() public override House GetHouse();Prototype原型模式(创建型模式)1、依赖关系

16、的倒置在软件系统中,经常面临着“某些结构复杂的对象”的创建工作:由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有着比较稳定一致的接口。如何向“客户程序”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求的改变而改变?使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。Prototype模式对于“如何创建易变类的实体对象”(创建型模式除了Singleton模式以外,都是用于解决创建易变类的实体对象的问题的)采用“原型克隆

17、”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方不断地Clone。Prototype模式中的Clone方法可以利用.NET中的Object类的MemberwiseClone()方法或者序列化来实现深拷贝。抽象工厂: public abstract class NormalActor public abstract NormalActor Clone() return (NormalActor)this.MemberwiseClone(); public abstract class FlyActor pu

18、blic abstract FlyActor Clone() return (FlyActor)this.MemberwiseClone(); public abstract class WaterActor public abstract WaterActor Clone() return (WaterActor)this.MemberwiseClone(); public class NormalActorB : NormalActor public class NormalActorB:NormalActor public class FlyActorA:FlyActor public

19、class FlyActorB:public class WaterActorA:WaterActor 游戏系统: public class GameSystem public void Run(NormalActor normalActor, FlyActor flyactor, WaterActor wateractor) NormalActor normalActor1 = normalActor.Clone(); NormalActor normalActor2 = normalActor.Clone(); NormalActor normalActor3 = normalActor.

20、Clone(); NormalActor normalActor4 = normalActor.Clone(); NormalActor normalActor5 = normalActor.Clone(); FlyActor flyactor1 = flyactor.Clone(); FlyActor flyactor2 = flyactor.Clone(); WaterActor wateractor1 = wateractor.Clone(); WaterActor wateractor2 = wateractor.Clone();将需要new的具体对象用参数传入,这样在GameSyst

21、em这个客户程序里面就只依赖于抽象而不依赖于具体了。具体的NormalActorA、FlyActorA等都不出现在GameSystem中。 GameSystem gameSystem = new GameSystem(); gameSystem.Run(new NormalActorB(), new FlyActorA(), new WaterActorA();有关创建型模式的讨论Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。Factory Method,Abstract Factory,Builder都需要一个额

22、外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。(其实原型就是一个特殊的工厂类,它只是把工厂和实体对象耦合在一起了)如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory,Builder,Prototype)。一般来说,如果可以使用Factory Method,那么一定可以使用Prototype。但是Prototype的使用情况一般是在类比较容易克隆的条件之上,如果是每个类实现比较简单,都可以只用实现MemberwiseClone,没

23、有引用类型的深拷贝,那么就更适合了。Prototype如果要实现深拷贝,还需要在每个要克隆的类上加序列化标签,这点复杂度要考虑进程序中。Adapter适配器模式(结构型模式)1、适配:即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。四、要点

24、Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。GoF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。Adapter模式可以实现的非常灵活,不必拘泥于GoF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便地适配。/对象适

25、配器(常用)class MyStack : IStack ArrayList list; public MyStack() list = new ArrayList(); public void Push(object item) list.Add(item); object Pop() return list.RemoveAt(list.Count - 1); /这种实际上是一种委派的调用,本来是发送请求给MyStack,但是MyStack实际上是委派给list去处理。MyStack在这里其实就是Adapter(适配对象),list即是Adaptee(被适配的对象),而IStack就是客户期

26、望的接口。/类适配器(少用)Bridge桥接模式(结构型模式)1、问题的出现假如我们需要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上功能都一样,都有同样的类型,面临同样的功能需求变化,比如坦克可能有很多种不同的型号:T50,T75,T90对于其中的坦克设计,我们可能很容易设计出来一个Tank的抽象基类,然后各种不同型号的Tank继承自该类;另外的变化原因但是PC和手机上的图形绘制、声效、操作等实现完全不同因此对于各种型号的坦克,都要提供各种不同平台上的坦克实现:二、动机思考上述问题的症结:事实上由于Tank类型的固有逻辑,使得Tank类型具有了两个变化的维度一个变化的维度为“平台的

27、变化”,一个变化的维度为“型号的变化”。如何应对这种“多维度的变化”?如何利用面向对象技术来使得Tank类型可以轻松地沿着“平台”和“型号”两个方向变化,而不引入额外的复杂度?三、意图将抽象部分与实现部分分离,使它们都可以独立地变化。桥模式不能只是认为是抽象和实现的分离,它其实并不仅限于此。如下面的例子,两个都是抽象的部分。更确切的理解,应该是将一个事物中多个维度的变化分离。Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象(Tank的型号)和实现(不同的平台)可以沿着格子的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”它们(比如不同的Tank型号子类,和不同的平台子类),得到各个子类之后,便可以任意组合它们,从而获得不同平台上的不同型号。Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。 public abstract class Tank protected TankPlatformImplementation tankImpl; public Tank(

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1