软件设计模式复习大纲
自己整理的,大部分都是来自保加利亚电信某老师的ppt的最后两三页,整合出来自己看着爽一点
如果这东西让哪个学弟没挂科记得给我点留言当反馈(?)
零、耦合的定义:软件系统结构中各模块间相互联系紧密程度的一种度量。
一、面向对象设计原则
1.单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
2.开闭原则:一个软件实体应当对扩展开放,对修改关闭。即在不修改源代码的基础上扩展一个系统的行为。(软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。)
3.里氏代换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
4.依赖倒转原则:要针对接口编程,不要针对实现编程。
5.接口隔离原则:指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。
6.合成复用原则:尽量使用对象组合,而不是继承来达到复用的目的。
7.迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用。
二、类之间的耦合
1.零耦合关系
2.具体耦合关系
3.抽象耦合关系
三、对于面向对象的软件系统设计来说,在支持可维护性的同时,需要提高系统的可复用性。
软件的复用可以提高软件的开发效率,提高软件质量,节约开发成本,恰当的复用还可以改善系统的可维护性。
四、软件模式的定义:软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式可以认为是对软件开发这一特定“问题”的“解法”的某种统一表示,即软件模式等于一定条件下的出现的问题以及解法。
五、设计模式的定义:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
六、为什么要使用设计模式?
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。使用这些方案将避免我们做一些重复性的工作,而且可以设计出高质量的软件系统。
七、设计模式的基本要素:
1.模式名称、
2.问题、
3.目的、
4.解决方案、
5.效果、
6.实例代
7.相关设计模式
关键元素:模式名称、问题、解决方案和效果
八、设计模式有几种类型?
设计模式根据其目的可分为创建型,结构型和行为型三种;根据范围可分为类模式和对象模式两种。
范围\目的 |
创建型模式 |
结构型模式 |
行为型模式 |
类模式 |
工厂方法模式 |
(类)适配器模式 |
解释器模式 模板方法模式 |
对象模式 |
抽象工厂模式 建造者模式 原型模式 单例模式 |
(对象)适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 |
职责链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 |
九、简单工厂模式:
9.1定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
9.2包含的角色:
工厂角色:负责实现创建所有实例的内部逻辑;
抽象产品角色:是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;
具体产品角色:是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
9.3特点:
当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
9.4优点:
实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责
9.5缺点:
工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
9.6适用情况:
工厂类负责创建的对象比较少;
客户端只知道传入工厂类的参数,对于如何创建对象不关心。
十、工厂方法模式:
10.1定义:
工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
10.2 包含的角色:
抽象产品:抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类型,即产品对象的共同父类或接口;
具体产品:具体产品实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们之间往往一一对应;
抽象工厂:抽象工厂中声明了工厂方法,用于返回一个产品,它是工厂方法模式的核心,任何在模式中创建对象的工厂类都必须实现该接口;
具体工厂:具体工厂是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例。
10.3特点:
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
10.4 优点:
增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;
10.5 缺点:
增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
10.6 适用情况:
一个类不知道它所需要的对象的类;一个类通过其子类来指定创建哪个对象;将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。
十一、抽象工厂模式:
10.1 定义:
抽象工厂模式(Abstract Factory Pattern):又称为Kit模式,属于对象创建型模式。
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
10.2包含的角色
抽象工厂: 抽象工厂用于声明生成抽象产品的方法;
具体工厂: 具体工厂实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;
抽象产品:抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;具体产品:具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。
10.3特点:
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
10.4 优点:
隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;
10.5缺点
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
10.6 适用情况:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;
系统中有多于一个的产品族,而每次只使用其中某一产品族;
属于同一个产品族的产品将在一起使用;
系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
十一、原型模式
11.1 定义:
原型模式(Prototype Pattern):原型模式是一种对象创建型模式,
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。
原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。
11.2 角色:抽象原型类、具体原型类、客户类
抽象原型类定义具有克隆自己的方法的接口;具体原型类:实现具体的克隆方法,在克隆方法中返回自己的一个克隆对象;让一个原型克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个对象,再通过调用该对象的克隆方法复制得到多个相同的对象。
11.3 特点:
在Java中可以直接使用Object提供的clone()方法来实现对象的克隆,能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个Java类支持复制。
在浅克隆中,当对象被复制时它所包含的成员对象却没有被复制;
在深克隆中,除了对象本身被复制外,对象包含的引用也被复制,也就是其中的成员对象也将复制。
在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆;如果需要实现深克隆,可以通过序列化等方式来实现。
11.4 优点:
优点在于可以快速创建很多相同或相似的对象,简化对象的创建过程,还可以保存对象的一些中间状态
11.5 缺点:
缺点在于需要为每一个类配备一个克隆方法,因此对已有类进行改造比较麻烦,需要修改其源代码,并且在实现深克隆时需要编写较为复杂的代码。
11.6 适用情况:
创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得;
系统要保存对象的状态,而对象的状态变化很小;
需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。
十二、单例模式
12.1 定义
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
12.2 角色
单例角色:在单例类的内部实现只生成一个实例,同时它提供一个静态的工厂方法,让客户可以使用它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有。
12.3 特点:
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化它。除此之外,该模式中包含一个静态私有成员变量与静态公有的工厂方法。该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
12.5 优点
提供了对唯一实例的受控访问并可以节约系统资源
12.6缺点
因为缺少抽象层而难以扩展,且单例类职责过重。
12.7 适用情况:
系统只需要一个实例对象;客户调用类的单个实例只允许使用一个公共访问点。
十三、组合模式
13.1 定义
组合模式(Composite Pattern):组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。
组合模式又可以称为“整体-部分”(Part-Whole)模式,属于对象的结构模式,它将对象组织到树结构中,可以用来描述整体与部分的关系。
13.2 角色
抽象构件:抽象构件为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现;
叶子构件:在组合结构中表示叶子节点对象,叶子节点没有子节点;
容器构件在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为。
13.3 特点
组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
13.4 优点
组合模式可以方便地对层次结构进行控制,客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,简化了客户端代码
13.5 缺点
组合模式在于使设计变得更加抽象,且增加新构件时可能会产生一些问题,而且很难对容器中的构件类型进行限制。
13.6 适用情况
需要表示一个对象整体或部分层次;
让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节;
对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。
13.7组合模式根据抽象构件类的定义形式,又可以分为透明组合模式和安全组合模式。
十四、装饰模式
14.1 动机
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
14.2 定义
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。
14.3 角色
抽象构建:抽象构件定义了对象的接口,可以给这些对象动态增加职责(方法);
具体构建:具体构件定义了具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法);
抽象装饰类:抽象装饰类是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现;
具体装饰类:具体装饰类是抽象装饰类的子类,负责向构件添加新的职责。
14.4 特点
使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
14.5 优点
装饰模式的主要优点在于可以提供比继承更多的灵活性,可以通过一种动态的方式来扩展一个对象的功能,并通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,而且具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类;
14.6 缺点
其主要缺点在于使用装饰模式进行系统设计时将产生很多小对象,而且装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。
14.7 适用情况
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
需要动态地给一个对象增加功能,这些功能也可以动态地被撤销;
当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
14.8 装饰模式可分为透明装饰模式和半透明装饰模式:
在透明装饰模式中,要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该声明具体构件类型和具体装饰类型,而应该全部声明为抽象构件类型;
半透明装饰模式允许用户在客户端声明具体装饰者类型的对象,调用在具体装饰者中新增的方法。
十五、外观模式
15.1 动机
引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
15.2 定义
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式又称为门面模式,它是一种对象结构型模式。
15.3 角色:
外观角色是在客户端直接调用的角色,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理;
子系统角色:在软件系统中可以同时有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能。
15.4 特点
外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
15.6 优点
外观模式主要优点在于对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;
15.7缺点
缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
15.8 适用情况
要为一个复杂子系统提供一个简单接口;
客户程序与多个子系统之间存在很大的依赖性;
在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。
十六、代理模式
16.1 动机
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。
16.2 定义
代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。
16.3 角色
抽象主题角色声明了真实主题和代理主题的共同接口;
代理主题角色内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象;
真实主题角色定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。
16.4 优点
代理模式的优点在于能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
16.5 缺点
缺点在于由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,并且实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
16.6 子分类
1)远程代理:
远程代理为一个位于不同的地址空间的对象提供一个本地的代表对象,它使得客户端可以访问在远程机器上的对象。
特点:远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
2)虚拟代理
如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建,这个小对象称为虚拟代理。
特点:虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
3)保护代理
保护代理可以控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
4)Copy-on-Write代理
它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
5)缓冲(Cache)代理:
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
6)防火墙(Firewall)代理:保护目标不让恶意用户接近。
7)同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
8)智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。
十七、迭代器模式
17.1 定义
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
17.2 角色
抽象迭代器定义了访问和遍历元素的接口;
具体迭代器实现了抽象迭代器接口,完成对聚合对象的遍历;
抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口;
具体聚合类实现了创建相应迭代器的接口。
17.3 特点
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。
17.4 优点
它支持以不同的方式遍历一个聚合对象,还简化了聚合类,而且在同一个聚合上可以有多个遍历
17.5 缺点
其缺点在于增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
17.6 适用情况
访问一个聚合对象的内容而无须暴露它的内部表示;
需要为聚合对象提供多种遍历方式;
为遍历不同的聚合结构提供一个统一的接口。
Java语言的Iterator接口就是迭代器模式的应用。
17.x 有关聚合
聚合是一个管理和组织数据对象的数据结构。
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
存储数据是聚合对象最基本的职责。
十八、观察者模式
18.1 动机
建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为被观察目标,而被通知的对象称为观察者,一个被观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
18.2 定义
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
18.3 角色
目标:目标又称为主题,它是指被观察的对象;
具体目标:具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;
观察者:观察者将对观察目标的改变做出反应;
具体观察者:在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致。
18.4 特点
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新。
18.5 优点
优点在于可以实现表示层和数据逻辑层的分离,并在观察目标和观察者之间建立一个抽象的耦合,支持广播通信
18.6 缺点
其主要缺点在于如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间,而且如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
18.7 适用情况
一个抽象模型有两个方面,其中一个方面依赖于另一个方面;一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变;一个对象必须通知其他对象,而并不知道这些对象是谁;需要在系统中创建一个触发链。
在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了Java语言对观察者模式的支持。
十九、策略模式
19.1 动机
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。
19.2 定义
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。
19.3 角色
环境类:环境类在解决某个问题时可以采用多种策略,在环境类中维护一个对抽象策略类的引用实例;
抽象策略类:抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类;
具体策略类:具体策略类实现了在抽象策略类中定义的算法。
19.4 特点
策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。
19.5 优点
策略模式主要优点在于对“开闭原则”的完美支持,在不修改原有系统的基础上可以更换算法或者增加新的算法,它很好地管理算法族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式;
19.6 缺点:
其缺点在于客户端必须知道所有的策略类,并理解其区别,同时在一定程度上增加了系统中类的个数,可能会存在很多策略类。
19.7 适用情况
在一个系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多行为中选择一种行为;
一个系统需要动态地在几种算法中选择一种;避免使用难以维护的多重条件选择语句;
希望在具体策略类中封装算法和与相关的数据结构。
二十、UML
w UML是一种分析设计语言,即一种建模语言。UML是由图形符号表达的建模语言,其结构主要包括视图、图、模型元素和通用机制四部分。
w UML包括5种视图,分别是用户视图、结构视图、行为视图、实现视图和环境视图。
w 在UML2.0中,提供了13种图,分别是用例图、类图、对象图、包图、组合结构图、状态图、活动图、顺序图、通信图、定时图、交互概览图、组件图和部署图。
w UML已成为用于描绘软件蓝图的标准语言,它可用于对软件密集型系统进行建模,其主要特点包括:工程化、规范化、可视化、系统化、文档化和智能化。
w 类图使用出现在系统中的不同类来描述系统的静态结构,类图用来描述不同的类和它们的关系。
w 在UML中,类之间的关系包括关联关系、依赖关系、泛化关系和实现关系,其中关联关系又包括双向关联、单向关联、自关联、重数性关联、聚合关系和组合关系。
w 顺序图是一种强调对象间消息传递次序的交互图,又称为时序图或序列图。顺序图以图形化的方式描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接收以及发送的顺序。顺序图允许直观地表示出对象的生存期,在生存期内,对象可以对输入消息做出响应,还可以发送信息。
w 顺序图由执行者、生命线、对象、激活框、消息和交互片段等元素组成。
w 状态图用来描述一个特定对象的所有可能状态及其引起状态转移的事件。我们通常用状态图来描述单个对象的行为,它确定了由事件序列引出的状态序列,一个状态图包括一系列的状态及状态之间的转移。
w 状态图由状态、初始状态、结束状态和转移等元素组成。在一个状态图中,一个状态也可以被细分为多个子状态,包含多个子状态的状态称为复合状态。