24种设计模式的定义和使用场合
- 格式:doc
- 大小:31.50 KB
- 文档页数:6
单例设计模式优缺点及使⽤场景单利模式的优缺点和使⽤场景⾸先介绍⼀下单例模式:单例模式(Singleton),也叫单⼦模式,是⼀种常⽤的软件设计模式。
在应⽤这个模式时,单例对象的类必须保证只有⼀个实例存在。
许多时候整个系统只需要拥有⼀个的全局对象,这样有利于我们协调系统整体的⾏为。
⽐如在某个服务器程序中,该服务器的配置信息存放在⼀个⽂件中,这些配置数据由⼀个单例对象统⼀读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。
这种⽅式简化了在复杂环境下的配置管理。
实现单例模式的思路是:⼀个类能返回对象⼀个引⽤(永远是同⼀个)和⼀个获得该实例的⽅法(必须是静态⽅法,通常使⽤getInstance这个名称);当我们调⽤这个⽅法时,如果类持有的引⽤不为空就返回这个引⽤,如果类保持的引⽤为空就创建该类的实例并将实例的引⽤赋予该类保持的引⽤;同时我们还将该类的构造函数定义为私有⽅法,这样其他处的代码就⽆法通过调⽤该类的构造函数来实例化该类的对象,只有通过该类提供的静态⽅法来得到该类的唯⼀实例。
需要注意的地⽅:单例模式在多线程的应⽤场合下必须⼩⼼使⽤。
如果当唯⼀实例尚未创建时,有两个线程同时调⽤创建⽅法,那么它们同时没有检测到唯⼀实例的存在,从⽽同时各⾃创建了⼀个实例,这样就有两个实例被构造出来,从⽽违反了单例模式中实例唯⼀的原则。
解决这个问题的办法是为指⽰类是否已经实例化的变量提供⼀个互斥锁(虽然这样会降低效率)。
优点:1.在单例模式中,活动的单例只有⼀个实例,对单例类的所有实例化得到的都是相同的⼀个实例。
这样就防⽌其它对象对⾃⼰的实例化,确保所有的对象都访问⼀个实例2.单例模式具有⼀定的伸缩性,类⾃⼰来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
3.提供了对唯⼀实例的受控访问。
4.由于在系统内存中只存在⼀个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式⽆疑可以提⾼系统的性能。
简述对象池的原理并举例说明使用场合对象池是一种常见的设计模式,它通过事先创建并管理一组特定的对象,以便在需要时可以重复使用这些对象,而不是每次都创建新的对象。
它的原理是通过预先创建一定数量的对象,并将其保存在一个数据结构中,通常是一个队列或者一个栈。
当需要使用对象时,从对象池中取出一个对象,并将其标记为已使用状态。
当对象不再需要时,将其重新放回对象池中,并将其状态标记为未使用。
通过这种方式,可以避免对象的频繁创建和销毁,提高系统性能和效率。
1.网络连接池:在开发网络应用程序时,通常需要与数据库、消息队列或其他服务进行通信。
每次进行通信时,都要创建一个新的网络连接对象,并在完成后销毁。
如果每次通信都创建和销毁连接对象,会导致系统性能下降。
使用对象池技术,可以预先创建一定数量的连接对象,并在需要时从池中获取,并在使用完毕后放回池中。
这样可以大幅提高网络通信的效率。
2.线程池:在多线程编程中,线程的创建和销毁是非常耗费资源的操作。
如果每次需要执行任务时都创建新的线程,会导致系统负载增加和效率下降。
线程池就是一种对象池,它预先创建一定数量的线程,并在需要执行任务时从线程池中获取一个可用的线程来执行任务,任务执行完毕后将线程放回线程池中供其他任务使用,从而避免了频繁创建和销毁线程,提高了系统的性能和效率。
3.连接池:在数据库应用程序中,连接数据库是一项常见的操作。
如果每次需要连接数据库都创建一个新的数据库连接,会导致系统的资源浪费和效率下降。
连接池是一种特殊的对象池,它在应用程序启动时会创建一定数量的数据库连接,并将其保存在连接池中。
当需要使用数据库连接时,从连接池中获取一个可用的连接,并在使用完毕后将其放回连接池中,以供其他请求使用。
这样可以有效地管理数据库连接,提高系统的性能和效率。
4.对象缓存池:在一些需要频繁创建和销毁的对象上,使用对象缓存池可以提高系统性能。
例如,对于一些耗时的计算操作或者复杂的对象创建过程,可以将计算结果或者创建好的对象保存在对象池中,当下次需要时,可以直接从对象池中获取,避免重复计算和创建。
内容提要★结构型设计模式小结包装型模式群设计模式实例分析Structural Patterns结构模式描述如何将类或者对象结合在一起形成更大的结构。
类的结构模式:类的结构模式使用继承把类、接口等组合在一起,以形成更大的结构。
当一个类从父类继承并实现某接口时,这个新的类就把父类的结构和接口的结构组合起来。
类的结构模式是静态的。
对象的结构模式:对象的结构模式描述了怎样把各种不同类型的对象组合在一起,以实现新功能的方法。
可以在运行时刻改变对象组合关系,对象的结构模式是动态的。
结构模式主要有:Adapter 适配器模式Bridge 桥接模式Composite组合模式Decorator 装饰模式Facade 门面模式Flyweight享元模式Proxy 代理模式1 AdapterAliases:WrapperIntent将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作Motivation有时为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配图示:1. 对象Adapter:Adapter与Adaptee是委派关系图示:2. 类Adapter:Adapter与Adaptee是继承关系Adapter 模式的关键特征Adapter 模式的关键特征用一个满足现有接口需求的新类包含已有类,调用已有类的方法实现新类中的方法实现Adapter 模式使得先前存在的对象可以匹配新的类型,而不受该对象原有接口的限制效果Adapter 对Adaptee 进行适配,使其满足Adapter’s Target 的要求。
这是的用户可以实际使用Adaptee ,就好像它是一种Target 一样。
参与者和协作者Adapter 面向所需的接口提供一个包装器解某系统拥有合适的数据和行为,但接口并不合要求。
问题将一个你难以控制(如无法修改其内部代码)的对象匹配到特定的接口上意图2 BridgeAliases:Handle/BodyIntent将抽象部分与它的实现部分分离,使它们都可以独立地变化Motivation要做到“抽象(接口)与实现分离”,最常用的办法是定义一个抽象类,然后在子类中提供实现。
设计模式复习题(1)以下是模式的基本要素的是。
ABCDA)名称B)意图C)解决方案D)参与者和协作者(2)常用的描述设计模式的格式有。
ABCDA)意图B)动机C)适用性D)结构(3)以下哪些问题通过应用设计模式能够解决。
ADA)指定对象的接口B)排除软件BUG C)确定软件的功能都正确实现D)设计应支持变化(4)面向对象系统中功能复用的最常用技术是。
ABA)类继承B)对象组合C)使用抽象类D)使用实现类(5)以下属于行为对象模式的是。
ABCDA)模板(Template Method)模式B)迭代器(Iterator)模式C)命令(Command)模式D)观察者(Observer)模式(6)以下属于创建型模式的是。
ACA)抽象工厂(Abstract Factory)模式B)合成(Composite)模式C)单例(Singleton)模式D)桥接(Bridge)模式(7)在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互。
主要体现在。
ADA)适配器(Adapte)模式B)合成(Composite)模式C)原型(Prototype)模式D)桥接(Bridge)模式(8)单例模式中,两个基本要点( a b )和单子类自己提供单例A .构造函数私有 B.唯一实例C.静态工厂方法D.以上都不对(9)常用的基本设计模式可分为。
AA)创建型、结构型和行为型B)对象型、结构型和行为型C)过程型、结构型和行为型D)抽象型、接口型和实现型(10)以下关于创建型模式说法正确的是。
AA)创建型模式关注的是对象的创建B)创建型模式关注的是功能的实现C)创建型模式关注的是组织类和对象的常用方法D)创建型模式关注的是对象间的协作(11)封装分布于多个类之间的行为的模式是。
CA)观察者(Observer)模式B)迭代器(Iterator)模式C)访问者(Visitor)模式D)策略(Strategy)模式(12)Observer(观察者)模式适用于。
设计模式的定义和分类1、设计模式的定义和分类设计迷失的出现可以让开发⼈员站在前⼈的肩膀上,通过⼀些成熟的设计⽅案来指导新项⽬的设计和开发没以便于开发出具有更好的灵活性和可拓展性。
也更易于复⽤的软件系统,设计模式是⼀套被反复使⽤的、多数⼈知晓的、经过分类编⽬的、代码设计经验的总结,使⽤设计模式是为了可重⽤代码,让代码更容易被他⼈理解并且提⾼代码的可靠性。
设计模式是⼀种⽤于对系统中不断重现的设计问题的解决⽅案进⾏⽂本化的技术,也是⼀种共享专家设计经验的技术。
GoF对设计模式的定义如下:设计模式是指在特定环境下为解决某⼀通⽤软件设计问题提供的⼀套定制的解决⽅案,该解决⽅案描述了对象和类之间的相互作⽤2、设计模式的基本要素(1)模式名称模式名称通过⼀两个关键词来描述模式的问题、解决⽅案和效果,以便⽤户更好地理解设计模式并便于开发⼈员之间的交流。
绝⼤多数数模式都是跟据其功能或者模式结构来命名的,在学习设计模式时候,⾸先应该准确的记忆该设计模式的中引⽂模式名,在已有的类库中,很多使⽤了设计模式的类名通常包含了使⽤的设计模式的名称,如果⼀个类名称为XXXAdapter,则该类是⼀个适配器类,在设计时使⽤了适配器模式,如果⼀个类名称为XXXFactory,则该类是⼀个⼯⼚类,⼀定包含了⼀个⼯⼚⽅法⽤于返回⼀个类的实例对象。
(2)问题问题描述了应该在什么时候使⽤设计模式,包含了原始设计中存在的问题以及问题存在的原因。
这些问题有些事特定的设计问题,如怎样使⽤对象封装状态或者使⽤对象标识算法等,也可能是系统中存在不灵活的类或对象结构导致系统的可维护性较差,有时候,在模式的问题藐视部分可能会包含使⽤该设计模式时必须满⾜的⼀系列先决条件,如在使⽤桥接模式时系统中的类必须存在两个独⽴变化的维度,在使⽤组合模式的时候系统中必须存在整体和部分的层次结构等。
在对问题进⾏描述的同时实际上确定了模式所对应的使⽤环境以及模式的使⽤动机(3)解决⽅案解决⽅案描述了设计模式的组成成分,以及这些组成成分之间的相互关系,各⾃的职责和协作⽅式,模式时⼀个通⽤的模板,它可以应⽤于各种不同的场合。
(1)以下是模式的基本要素的是。
ABCDA)名称B)意图C)解决方案D)参与者和协作者(2)常用的描述设计模式的格式有。
ABCDA)意图B)动机C)适用性D)结构(3)以下哪些问题通过应用设计模式能够解决。
ADA)指定对象的接口B)排除软件BUG C)确定软件的功能都正确实现D)设计应支持变化(4)面向对象系统中功能复用的最常用技术是。
ABA)类继承B)对象组合C)使用抽象类D)使用实现类(5)以下属于行为对象模式的是。
ABCDA)模板(Template Method)模式B)迭代器(Iterator)模式C)命令(Command)模式D)观察者(Observer)模式(6)以下属于创建型模式的是。
ACA)抽象工厂(Abstract Factory)模式B)合成(Composite)模式C)单例(Singleton)模式D)桥接(Bridge)模式(7)在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互。
主要体现在。
ADA)适配器(Adapte)模式B)合成(Composite)模式C)原型(Prototype)模式D)桥接(Bridge)模式(8)单例模式中,两个基本要点( a b )和单子类自己提供单例A .构造函数私有 B.唯一实例C.静态工厂方法D.以上都不对(9)常用的基本设计模式可分为。
AA)创建型、结构型和行为型B)对象型、结构型和行为型C)过程型、结构型和行为型D)抽象型、接口型和实现型(10)以下关于创建型模式说法正确的是。
AA)创建型模式关注的是对象的创建B)创建型模式关注的是功能的实现C)创建型模式关注的是组织类和对象的常用方法D)创建型模式关注的是对象间的协作(11)封装分布于多个类之间的行为的模式是。
CA)观察者(Observer)模式B)迭代器(Iterator)模式C)访问者(Visitor)模式D)策略(Strategy)模式(12)Observer(观察者)模式适用于。
介绍商业模式的六种设计方法本文介绍6种商业模式设计方法:客户洞察、创意构思、可视思考、原型制作、故事讲述和情景推测。
这些来自设计领域的技术方法和工具,能够帮助你设计更好、更具创意的商业模式。
方法1 客户洞察(Customer Insights)基于客户洞察建立商业模式企业在市场研究上投入了大量的精力,然而在设计产品、服务和商业模式上却往往忽略了客户的观点。
良好的商业模式设计应该避免这个错误,需要依靠对客户的深入理解,包括环境、日常事务、客户关心的焦点及愿望。
正如汽车制造商先驱亨利·福特曾经说过的那样:“如果我问我的客户他们想要什么,他们会告诉我‘一匹更快的马’。
”另一个挑战在于要知道该听取哪些客户和忽略哪些客户的意见。
有时,未来的增长领域就在现金牛的附近。
因此商业模式创新者应该避免过于聚焦于现有客户细分群体,而应该盯着新的和未满足的客户细分群体。
许多商业模式创新的成功,正是因为它们满足了新客户未得到满足的需求。
如何使用(客户)移情图任何研究商业模式的人都应该大致描述出所需要满足的客户细分群体的特征。
移情图(图1)是Xplane公司开发设计的一个可视思考工具。
我们称其为“超简客户分析器”,这个工具可以帮助你超越客户的人口学特征,更好地理解客户的环境、行为、关注点和愿望。
移情图是这样发挥作用的。
首先,找出你的相关商业模式中可提供服务的所有客户细分群体。
选出3个有希望的候选人,并选择一个开始客户描述分析。
首先给这个客户一个名字和一些人口统计特征,诸如收入、婚姻状况等。
然后参考的图表,通过询问和回答以下6个问题,在活动挂图或白板上描绘你新命名的客户。
方法2 创意构思(Ideation)生成全新商业模式创意绘制一个已经存在的商业模式是一回事;设计一个新的创新商业模式是另一回事。
设计新的商业模式需要产生大量商业模式创意,并筛选出最好的创意,这是一个富有创造性的过程。
这个收集和筛选的过程被称做创意构思。
一.创建型模式(Creational):简单工厂模式(simpleFactory)发音:['simpl] ['fækt(ə)rɪ]定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口,抽象类,也可以是具体的类.1.抽象工厂(AbstractFactory)发音: ['æbstrækt]定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.使用场合:1.如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话书,希望一个系统只是知道产品的接口,而不关心实现的时候.2.如果一个系统要由多个产品系列中的一个来配置的时候.换句话说,就是可以,就是可以动态地切换产品簇的时候.3.如果强调一系列相关产品的接口,以便联合使用他们的时候2.建造者模式(Builder)发音: ['bɪldə]定义:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.使用场合:1.如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时2.如果同一个构建过程有着不同的表示时3.工厂方法模式(Factory Method)定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到了子类.使用场景:1.客户类不关心使用哪个具体类,只关心该接口所提供的功能.2.创建过程比较复杂,例如需要初始化其他关联的资源类,读取配置文件等.3.接口有很多具体实现或者抽象类有很多具体子类时,4.不希望给客户程序暴露过多的此类的内部结构,隐藏这些细节可以降低耦合度.5.优化性能,比如缓存大对象或者初始化比较耗时的对象.4.原型模式(Prototype Method)发音: ['prəʊtətaɪp]定义:使用原形实例指定将要创建的对象类型,通过复制这个实例创建新的对象.应用场合:1.如果一个系统想要独立于它想要使用的对象时,可以使用原型模式,让系统只面向接口编程,在系统需要新的对象的时候,可以通过克隆原型来得到.2.如果需要实例化的类是在运行时刻动态指定时,可以使用原型模式,通过克隆原型来得到需要的实例.5.单例模式(Singleton) 发音: ['sɪŋg(ə)lt(ə)n]定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点.使用场合:当需要控制一个类的实例只能有一个,而且客户只能从一个全局访问点访问它时,可以使用单例模式,这些功能恰好是单例模式要解决的问题.二.结构型模式(struct)发音: [strʌkt]6.适配器模式(Adapter)发音:[ə'dæptə]定义:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.使用场合;1.如果先要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口.2.如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这中情况可以使用适配器模式,到时候需要什么就适配什么.3.如果你想使用一些已经窜在的子类,是不坑对每一个子类都进行适配,这中情况可以使用适配器模式,直接适配这些子类的父类就可以了.7.桥接模式(Bridge)发音: [brɪdʒ]定义:将抽象部分与它的实现部分分离,使他们可以独立变化.使用场合:1.如果你不希望在抽象部分和实现部分采用固定的绑定关系,可以采用桥接模式.2.如果出现抽象部分和实现部分都能够扩展的情况,可以采用桥接模式,让抽象部分和实现部分独立地变化.3.如果希望实现部分的修改不会对客户产生影响,可以采用桥接模式.4.如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式.8.组合模式(Composite)发音: ['kɒmpəzɪt]定义:将对象组合成属性结构以表示"部分-整体"的层次结构,组合模式使用的用户对单个对象和组合对象的使用具有一致性.使用场合:1.如果你想表示对象的部分-整体层次结构,可以使用..把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用,这个层次结构也容易.2.如果希望同意地使用组合结构中的所有对象,可以选用...,这正是组合模式提供的主要功能.9.装饰器模式(Decorator Method)发音: ['dekəreɪtə]定义:动态的给一个对象增加一些额外的职责,就增加功能来说,装饰模式生成子类更为灵活.使用场合:1.如果需要爱不影响其他对象的情况下,以动态,透明的方式给对象添加职责,可以使用装饰模式.2.如果不适合使用子类来进行扩展的时候,可以考虑使用装饰模式.10.外观模式(Facade)发音: [fə'sɑ:d]定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加同容易使用.使用场景:1.如果希望为一个复杂的子系统提供一个简单接口的时候,可以考虑使用外观模式.使用外观对象来实现大部分客户需要的功能,从而简化客户的使用.2.如果想要让客户程序和抽象类的实现部分松散耦合,可以考虑使用外观模式,使用外观对象来将这个子系统与他的客户分离开来,从而提高子系统的独立性和可移植性.3.如果构建多层节后的系统,可以考虑使用外观模式使用外观模式对象作为每层的入口,这样可以简化层间调用,也可以松散出层次之间的依赖关系.11.享元模式(Flyweight)发音: ['flaɪweɪt]定义:运用共享技术有效地支持大量细粒度的对象.使用场合:1.如果一个应用程序使用了大量的细粒度对象,可以使用享元模式来减少对象的数量.2.如果犹豫使用大量的对象,造成很大的存储开销,可以使用享元模式来减少对象数量,并节约内存.3.如果对象的大多数状态都可以转变成外部状态,比如通过计算得到,或者从外部传入等,可以使用享元模式来实现内部状态和外部状态的分离.4.如果不考虑对象的外部状态,可以用相对较少的共享对象取代很多组合对象,可以使用享元模式来共享对象.然后组合对象来使用这些共享对象.12.代理模式(Proxy)发音: ['prɒksɪ]定义:为其他对象提供一种代理以控制对这个对象的访问.使用场合:1.需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理.2.需要按照需要创建开销很大的对象的时候,可以使用虚代理.3.需要控制对原始对象的访问的时候,可以使用保护代理.4.需要在访问你对象执行一些附加操作的时候,可以使用智能指引代理.三.行为型模式(behavioral)发音[bi'heivjərəl]13.职责链模式(Chain Of Responsibility)发音: [tʃeɪn] [rɪ,spɒnsɪ'bɪlɪtɪ]定义:使多个对象都有机会处理请求,,从而避免请求的发送者和接收者之间耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.使用场合:1.如果有多个对象可以处理同一个请求,但是具体由哪个对象来处理该请求,是运行时刻动态确定的.2.如果你想在不明确指定接收者的情况下,向多个对象中的其中一个提交请求的话,可以使用职责链模式.3.如果想要动态指定处理一个请求的对象结合,可以使用职责链模式.14.命令模式(Command)发音: [kə'mɑːnd]定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作.15.解释器模式(Interpreter)发音: [ɪn'tɜːprɪtə]定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.使用场合:16.迭代器模式(Iterator)定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.使用场合:1.如果你希望提供访问一个聚合对象的内容,但是又不想暴露他的内部表示的时候,可以使用迭代器模式来提供迭代器接口,从而让客户端只是通过迭代器的接口来访问聚合对象,而无须关心聚合对象的内部实现.2.如果你希望有多种遍历方式可以访问聚合对象,可以使用...3.如果你希望为遍历不同的聚合对象提供一个统一的接口,可以使用....17.中介模式(Mediator) 发音:['mi:dieitə]定义:用一个中介对象类封装一系列对象的交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互.使用场合:1.如果一组对象之间的通信方式比较复杂,导致相互依赖,结构混乱,可以采用中介模式,把这些对象相互的交互管理起来,各个对象都只需要和中介者交互,从而是的各个对象松散耦合,结构也更清晰易懂.2.如果一个对象引用很多的对象,并直接跟这些对象交互,导致难以复用该对象,可以采用中介者模式,把这个对象跟其他对象的交互封装到中介者对象里面,这个对象只需要和中介者对象交互就可了.18.备忘录模式(Memento)发音: [mɪ'mentəʊ]在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.使用场合:1.如果必须要保存一个对象在某一个时刻的全部或者部分状态,方便以后需要的时候,可以把该对象恢复到先前的状态,可以使用备忘录模式.2.如果需要保存一个对象的内部状态,但是如果用接口来让其他对象直接得到这些需要保存的状态,将会暴露对象的实现希捷并破坏对象的封装性,这是可以使用备忘录.19.观察者模式(Observer)发音: [əb'zɜːvə]定义:定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.使用场合;1.当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化,那么就可以选用观察者模式,将这两者封装成观察者和目标对象,当目标对象变化的时候,依赖于它的观察者对象也会发生相应的变化.这样就把抽象模型的这两个方面分离了使得,它们可以独立地改变和复用.2.如果在更改一个对象的时候,需要同时连带改变其他对象,而且不知道究竟应该有多少对象需要被连带改变,这种情况可以选用观察者模式,被改的那一个对象很明显就相当于是目标对象,而需要连带修改的对歌其他对象,就作为多个观察着对象了.3.当一个对象必须通知其他的对象,但是你又希望这个对象和其他被它通知的对象是松散耦合的,也就是说这个对象其实不详知道具体被通知的对象.这种情况可以选用观察者模式,这个对象就相当于是目标对象,而被它通知的对象就是观察者对象了.20.状态模式(State)发音: [steɪt]允许一个对象在其内部状态改变是改变它的行为.对象看起来似乎修改了他的类.使用场合:1.如果一个对象的行为取决于它的状态,而且它必须在运行时刻根据状态来改变它的行为,可以使用...来包状态和行为分离开.虽然分离了,但是状态和行为是有对应关系的,可以在运行期间,通过改变状态,就能够调用到该状态对应的状态处理对象上去从而改变对象的行为.2.如果一个操作中含有庞大的多分枝语句,而且这些分支依赖于该对象的状态,可以使用....把各个分支的处理分散包装到单独的对象处理类中,这样,这些分支对应的对象就可以不依赖于其他对象而独立变化了.21.策略模式(Strategy)发音: ['strætɪdʒɪ]定义:定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换.本模式使得算法可独立于使用它的客户而变化.使用场合;1.出现有许多相关的类,仅仅是行为有差别的情况下,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换2.出现同一算法,有很多不同实现的情况下,可以使用策略模式来把这些"不同的实现"实现成为一个算法的类层次.3.需要封装算法中,有与算法相关数据的情况下,可以使用策略模式来避免暴露这些跟算法相关的数据结构.4.出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况下,可以使用策略模式来替换这些条件语句.22.模版方法模式(Template Method)发音:['templeɪt; -plɪt]定义:定义在一个操作中的算法框架,把一些步骤推迟到子类去实现.模版方法模式让子类不需要改变算法的结构而重新定义特定的算法步骤功能:1.能够解决代码的冗余问题2.把某些算法步骤延迟到子类3.易于扩展4.父类提供了算法框架,控制了算法的执行流程,而子类不能改变算法的流程,子类的方法的调用由父类的模版方法决定.5.父类可以把那些重要的,不允许改变的方法屏蔽掉,不让子类去复写他们.1.需要固定定义算法骨架,实现一个算法的不变的部分,并把可变的行为留给子类来实现的情况.2.各个子类中具有公共行为,应该抽取出来,集中在一个公共类中去实现,从而避免复杂的代码重复3.需要控制子类扩展的情况.模版方法模式会在特定的点来调用子类的方法,这样只允许在这些点进行扩展.知识:回调:表示一段可执行逻辑的引用(或者指针),我们把该引用(或者指针)传递到另外一段逻辑(或者方法)里供这段逻辑适时调用(网站:)23.访问者模式(Visitor)发音:['vɪzɪtə]定义:表示一个作用于某对象结构中的各个元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.使用场合:1.如果想对一个对象结构实施一些依赖于对象结构中具体类的操作,可以使用访问者模式.2.如果想对一个对象结构中的各个元素进行很多不同的而且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式.3.如果对象结构很少变动,但是需要经常给对象结构中的元素定义新的操作,可以使用访问者模式.3.如果对象结构很少变动,但是需要经常给对象结构中的元素定义新的操作,可以使用访问者模式.。