`
Kingson_Wu
  • 浏览: 123700 次
文章分类
社区版块
存档分类
最新评论

OOAD之设计模式-行为模式

 
阅读更多

http://blog.csdn.net/mudeer2012/article/details/8453560


一、行为模式

行为模式关注的是对象的行为。该类型的模式需要做的是对可能变化的行为进行抽象,通过封装达到整个架构的可扩展性。例如策略模式,就是将可能变化的策略或算法抽象为一个独立的接口或抽象类,从而实现未来策略的扩展。其它的行为型设计模式也大致如此,或者封装一个请求(命令模式),或者封装一种状态(状态模式),或者封装访问的方式(访问者模式),或者封装遍历算法(迭代器模式)。这些模式所要封装的行为,恰恰是软件架构中最不稳定的部分,扩展的可能性也最大。将这些行为封装起来,利用抽象的特性,就提供了扩展的可能。
GOF模式中的行为型设计模式共有11种。其中,行为型类设计模式使用继承机制在类间分派行为,包括模板方法模式(Template Method)和解释器模式(Interpreter)共两种。行为型对象模式使用对象组合而不是继承,它描述一组对象怎样协作完成单个对象所无法完成的任务,包括责任链模式(Chain of Responsibility)、命令模式(Command)、迭代器模式(Iterator)、中介模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、访问者模式(Visitor)九种。

1.1模板方法模式template method

已知过程的主要流程步骤,但是某些具体的实现未知时,抽象类控制具体流程,实现类实现具体的步骤细节。只用继承。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法可以使子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。

模板方法模式意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用,同时也遵守了开闭原则。

把不变的行为搬到超类,去除子类中重复的代码来体现他的优势。

当不变的和可变的行为在方法中混合在一起时,不变的行为就会在子类中重复出现,模板方法模式就是将这些不变的行为搬移到一个超类中,避免重复代码。

1.2策略模式strategy

业务中某个问题的算法太多,不同环境的实现不同,将该算法抽象为一个接口,在具体的使用类中用组合来调用。

定义一系列算法:策略模式的功能就是定义一系列算法,实现让这些算法可以相互替换。所以会为这一系列算法定义公共的接口,以约束一系列算法要实现的功能。

避免多重条件语句,更好的扩展性。

缺点:

客户必须了解每种策略的不同。

增加了对象数目。

只适合扁平的算法结构:策略模式的一系列算法地位是平等的,是可以相互替换的,事实上构成了一个扁平的算法结构,也就是在一个策略接口下,有多个平等的策略算法,就相当于兄弟算法。而且在运行时刻只有一个算法被使用,这就限制了算法使用的层级,使用的时候不能嵌套使用。对于出现需要嵌套使用多个算法的情况,比如折上折、折后返卷等业务的实现,需要组合或者是嵌套使用多个算法的情况,可以考虑使用装饰模式、或是变形的职责链、或是AOP等方式来实现。
适用范围:
出现有许多相关的类,仅仅是行为有差别的情况,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换;
出现同一个算法,有很多不同的实现的情况,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次;
需要封装算法中,与算法相关的数据的情况,可以使用策略模式来避免暴露这些跟算法相关的数据结构;
出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句。

1.3观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

效果及实现要点
1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
3.在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
适用性
1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
  1. publicclassProductextendsObservable{
  2. privateStringname;
  3. privatefloatprice;
  4. publicStringgetName(){
  5. returnname;
  6. }
  7. publicvoidsetName(Stringname){
  8. this.name=name;
  9. }
  10. publicfloatgetPrice(){
  11. returnprice;
  12. }
  13. publicvoidsetPrice(floatprice){
  14. this.setChanged();
  15. this.notifyObservers(price);
  16. this.price=price;
  17. }
  18. }
  1. importjava.util.Observable;
  2. importjava.util.Observer;
  3. publicclassPriceObserverimplementsObserver{
  4. publicvoidupdate(Observableo,Objectarg){
  5. //TODOAuto-generatedmethodstub
  6. Productpro=(Product)o;
  7. if(pro.getPrice()>(Float)arg){
  8. System.out.println("降价:"+(pro.getPrice()-(Float)arg));
  9. }elseif(pro.getPrice()<(Float)arg){
  10. System.out.println("涨价:"+((Float)arg-pro.getPrice()));
  11. }
  12. }
  13. }

1.4命令模式command

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

目的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

效果及实现要点
1.Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。
2.实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。
3.通过使用Compmosite模式,可以将多个命令封装为一个“复合命令”MacroCommand。
4.Command模式与C#中的Delegate有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活,但抽象能力比较弱。
5.使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。
适用性
在下面的情况下应当考虑使用命令模式:
1.使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将一个函数登记上,然后在以后调用此函数。
2.需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。
3.系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。
4.如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

分享到:
评论

相关推荐

    设计模式-javaOOAD

    GoF(Gang of Four)设计模式由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者共同编写,是面向对象设计模式领域的经典之作。这些模式覆盖了创建型、结构型和行为型三个方面,旨在解决软件开发...

    软件开发方法与环境--设计模式(ppt)

    设计模式是软件开发者的必备技能之一,掌握好设计模式可以显著提高软件的质量和可维护性,是成为一名优秀软件工程师的关键步骤。通过深入学习和实践,我们可以更好地理解和应用这些模式,以应对复杂的软件开发挑战。

    OOAD-assignment2-refactoring

    【标题】"OOAD-assignment2-refactoring"指的是面向对象分析与设计(Object-Oriented Analysis and Design,简称OOAD)课程的第二次作业,重点在于重构。重构是软件开发过程中的一个重要环节,它旨在改善代码结构,...

    面向对象分析与设计课件(OOAD、英文)

    设计模式,如工厂模式、单例模式、观察者模式等,也是设计阶段的重要工具,它们提供了解决常见设计问题的标准化方法。 3. 对象分析(Object Analysis):OOAD - Lecture 3 Object Analysis (ch09-11).pdf 对象分析...

    OOAD.rar_设计模式 例

    "Observer"设计模式,也被称为"发布-订阅"模式,是其中的一种行为模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在这个名为"OOAD.rar_设计模式 ...

    面向对象分析设计OOAD.zip

    本压缩包包含了一系列关于OOAD的资料,涵盖了设计原则、UML建模、设计模式等多个关键知识点。 1. **设计原则**:设计原则是指导面向对象设计的基础,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则...

    OOAD教师用书(IBM 原厂)word版

    设计模式是OOAD中另一个重要的话题。设计模式是解决常见软件设计问题的标准化解决方案,如单例模式、工厂模式、观察者模式等。IBM的教材会详细讲解这些模式的原理、应用场景和实现方式,帮助学生掌握如何在实际项目...

    OOAD 台湾 著名设计开发人员做的关系系统设计与分析的PPT

    4. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,及其在解决特定问题时的应用。 5. **系统架构**:探讨整体系统架构的选择,如三层架构或微服务架构,以及它们的优势和挑战。 6. **...

    OOAD系列PPT

    第五章“行为型设计模式”主要介绍责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。这些模式主要关注对象间的行为交互和职责...

    OOAD2010级-2012级考题1

    GRASP是一组设计原则,指导如何在面向对象设计中分配职责,如控制器、多态、工厂等模式。 **FURPS(功能、可用性、可靠性、性能、可维护性)** FURPS是评价软件质量的标准,涵盖了系统的主要非功能需求。 **RUP...

    SVSE-S3冲刺题-OOAD

    6. **设计模式**:设计模式是解决常见问题的可重用解决方案,如工厂模式、单例模式、观察者模式等。 7. **需求分析**:在OOAD中,理解需求是至关重要的第一步,它涉及到识别问题域的关键实体、关系和行为。 8. **...

    OOAD.rar_OOAD

    总的来说,"OOAD.rar_OOAD"这个资源很可能是面向对象分析与设计的教程或指南,其中的"OOAD.pdf"可能涵盖了这些核心概念、原则以及设计模式的详细解析,对于程序员提升面向对象编程能力具有极高的价值。学习并熟练...

    OOAD课堂练习作业和代码

    **面向对象分析与设计(OOAD)是软件开发过程中至关重要的一环,它涉及到对问题域的...每个课堂练习都可能涵盖特定的设计模式、UML图的绘制或是对特定问题的解决方案。在实践中学习,无疑是掌握这些概念的最佳途径。

    OOAD学习资料

    25).pdf"和"OOAD - Lecture 6 Object Design 3(ch26-31).pdf"中,会深入探讨对象设计的步骤,包括接口设计、类的设计原则(如单一职责原则、开闭原则等)、继承和多态的使用,以及如何通过设计模式优化结构和提高...

    java设计模式案例

    压缩包中的"ooad"可能是指面向对象分析与设计(Object-Oriented Analysis and Design),这通常涉及到UML(统一建模语言)的使用,如类图、序列图、用例图等,它们可以帮助我们更好地理解和设计使用设计模式的系统。...

    OOAD与UMLpdf文件

    1. **设计模式应用**:使用已验证的设计模式,如工厂模式、单例模式、观察者模式等,来解决常见设计问题。 2. **接口设计**:定义类的公共行为,确保不同组件间的协同工作。 3. **类与对象的实现细节**:考虑数据...

    OOAD建模技术(完整PPT)

    总的来说,这个“OOAD建模技术”培训资料可能涵盖了UML的基本元素、图示类型、设计原则以及设计模式等多个方面,对于学习和提升软件开发能力非常有帮助。通过深入学习和实践,开发者可以更好地理解和构建复杂系统,...

    OOAD与UML资料和笔记.zip

    4. **设计模式**:介绍一些常见的设计模式,如工厂模式、单例模式、观察者模式等,以及它们在OOAD中的应用。 5. **软件生命周期**:OOAD在软件开发生命周期中的位置,以及如何与其他阶段(如需求分析、编码、测试等...

    Head First OOAD

    这本书以生动易懂的方式讲解了如何在实际项目中应用面向对象原则和设计模式,是IT从业者提升自身软件开发能力的重要参考资料。 该压缩包文件包含的是书中所有源代码示例,可以帮助读者更直观地理解书中的概念和方法...

Global site tag (gtag.js) - Google Analytics