软件设计模式之行为模式.ppt
《软件设计模式之行为模式.ppt》由会员分享,可在线阅读,更多相关《软件设计模式之行为模式.ppt(40页珍藏版)》请在三一办公上搜索。
1、第四章,行为模式,课程目标,Observer模式 Iterator模式 Strategy模式 Template模式 Visitor模式 Chain of Responsibility模式 Command模式 其他模式,如Interpreter模式、Mediator模式等,体验项目,本章体验项目的主要功能是使用Command模式实现窗体中鼠标画图功能,该程序主要由以下几个部分组成:,程序运行完成后,拖动鼠标在窗体上画出“Hello”字符,(1)命令接口Command,定义命令方法。,(2)具体命令角色MacroCommand和DrawCommand类,这两个类都实现Command接口,DrawC
2、ommand实现画图命令,MacroCommand类定义对命令的新增、执行和删除等方法。,(3)请求接口Drawable,DrawCanvas类实现Drawable接口,定义与具体请求相关的操作。,(4)客户端,继承JFrame并实现ActionListener和MouseMotionListener接口,创建窗体界面和各种事件,行为模式概述,行为模式涉及到算法和对象间职责的分配,行为模式描述了对象和类的模式,以及它们之间的通信模式,这些模式刻划了在程序运行时难以跟踪的复杂的控制流。,可分为行为类模式和行为对象模式两种:,(1)行为类模式使用继承机制在类间分派行为。,(2)行为对象模式使用对象
3、复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任何一个对象都无法单独完成的任务。这里一个重要的问题是对等对象如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在极端情况下,每一个对象都要了解所有其他的对象。,Chain of Responsibility模式,Chain of Responsibility模式即职责链模式,在有不止一个对象可以处理或实现客户请求的时候,责任链模式(CoR)会顺序地给每一个对象一次处理请求的机会。一个较好的例子就是Java的异常处理机制,当程序中发生异常时,将会比较与catch所捕捉的异常是否相符合,如果符合
4、就执行所设定的处理,如果都没有对比到适当的异处理,就会将异常丢出try catch程序块之外。,模式介绍,主要适用于以下情况:,有多个对象可以处理一个请求,但哪个对象来处理该请求是在运行时刻自动确定的。,想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。,希望动态的指定处理某个请求的对象集合。,Chain of Responsibility模式结构图,职责链模式结构图如下:,Handler:定义一个处理请求的接口。,ConcreteHandler:处理它所负责的请求,并可访问在该链中它的后继者。如果可处理该请求,就处理;否则将该请求转发给它的后继者。,Client:向链上的具体处理
5、者即ConcreteHandler对象提交请求。,Chain of Responsibility模式示例,public interface Handler public void handleRequest(char c);public class CharacterHandler implements Handler private Handler successor;public CharacterHandler(Handler successor)this.successor=successor;public void handleRequest(char c)if(Character.
6、isLetter(c)System.out.println(CharacterHandler类处理请求,返回结果:你输入的是字元);else successor.handleRequest(c);public class NumberHandler implements Handler private Handler successor;public NumberHandler(Handler successor)this.successor=successor;public void handleRequest(char c)if(Character.isDigit(c)System.out
7、.println(NumberHandler类处理请求,返回结果:你输入的是数字);else successor.handleRequest(c);public class SymbolHandler implements Handler public void handleRequest(char c)if(Character.isDefined(c)System.out.println(SymbolHandler类处理请求,返回结果:你输入的是符号);else System.out.println(请求未被处理);,处理字元,处理数字,处理符号,职责链模式优势和不足,职责链模式主要有以下几
8、个优点:,降低耦合度,职责链模式不足:,效率低,一个请求的完成可能要遍历到最后才可能完成。,扩展性差,在该模式中,一定要有一个统一的Handler接口。,增强了给对象指派职责的灵活性,Command模式,Command模式即命令模式,该模式把一个请求或者操作封装到一个对象中,并将发出命令的责任和执行命令的责任分割开,委派给不同的对象。允许请求的一方和发送的一方独立开来。,模式介绍,主要适用于以下情况:,抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(callback)函数表达这种参数化机制。,在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。,
9、支持取消操作。,支持修改日志。,用构件在原语操作上的高层操作构造一个系统。,Command模式结构图,命令模式结构图如下:,Command:声明执行操作的接口。,ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现execute()方法。,Receiver:知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。,Invoker:如果该命令可执行,则要求该命令执行这个请求,并存储ConcreteCommand对象。,Client:创建一个具体命令对象并设定它的接收者。,Command模式示例,Command模式在界面设计中得到了广泛的应用,比如
10、以下的示例:在窗体中添加四个按钮和一个文本框,其中三个按钮用于改变文本框的颜色,第四个按钮用于关闭窗体。具体实现如下:,interface CommandInterface public void processEvent();import javax.swing.JButton;class Blue extends JButton implements CommandInterface public void processEvent()Client.tf1.setBackground(Color.BLUE);public Blue(String name)super(name);class
11、 buttonHandler implements ActionListener public void actionPerformed(ActionEvent e)CommandInterface CommandObj=(CommandInterface)e.getSource();CommandObj.processEvent();,自定义四个按钮类,分别继承JButton并实现CommandInterface接口。,Blue类改变文本框的颜色为“BLUE”,Cyan类改变文本框的颜色为“cyan”,Red类改变文本框的颜色为“red”,ExitButton类实现关闭窗体的操作。都很类似所
12、以只给出了Blue类的参考代码。,Command模式优势和不足,不足:使用Command模式会导致系统有过多具体的 Command类。某些系统可能需要几十个,几百个甚至几千个具体Command类,这会使Command模式在这样的系统里变得不实际。,Command模式将“进行操作请求”的对象和“知道如何执行操作”的对象分离开来。,多个command可以被组装成一个复合command。,很容易增加新的command,因为不需要修改现有的类。,Command模式具有以下优点:,Command对象可以像任何其它对象一样被使用和继承。,Iterator模式,Iterator模式即迭代器模式,用于遍历集合
13、类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构,模式介绍,主要适用于以下情况:,访问一个聚合对象的内容而无需暴露它的内部表示,多个对象聚在一起形成的总体称之为聚合,聚合对象是能够包容一组对象的容器对象。,支持对聚合对象的多种遍历。,为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)。,Iterator模式结构图,迭代器模式结构图如下:,Iterator:定义访问和遍历元素的接口。,ConcreteIterator:实现了Iterator接口的具体迭代器,用于对聚合对象遍历时跟踪当前的位置。,Aggregate:定义创建相应迭代器的接口。
14、,ConcreteAggregate:实现了Aggregate接口的聚合对象,实现了返回一个ConcreteIterator实例的方法。,Iterator模式示例,public interface MyIterator public boolean hasNext();public Object next();import java.util.List;public class ListIterator implements MyIterator private List list=null;private int index;public ListIterator(List l)index=
15、-1;this.list=l;public boolean hasNext()return indexlist.size()-1;public Object next()+index;return list.get(index);import java.util.List;public interface MyList extends Listpublic MyIterator getIterator();public MyIterator getReverseIterator();import java.util.Vector;public class MyVector extends Ve
16、ctor implements MyListpublic MyIterator getIterator()return new ListIterator(this);public MyIterator getReverseIterator()return new ReverseListIterator(this);,Iterator模式优势和不足,使用迭代抽象:使得访问一个聚合对象的内容而无需暴露它的内部表示。,提供迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。,主要缺点在与迭代器的健壮性问题:遍历的同时更改迭代器所在的集合结构,会导致问题出现
17、。,Iterator模式优点和不足:,Observer模式,Observer模式实现了表示层和数据逻辑层的分离,使其允许独立的改变目标和观察者。你可以单独复用目标对象而无需同时复用其观察者,反之亦然。它也使你可以在不改动目标和其他观察者的前提下增加观察者。,模式介绍,主要适用于以下情况:,当一个抽象模型存在两个方面,其中一个方面依赖于另一方面,将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。,当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变时。,当一个对象必须通知其它对象,而它又不能假定其它对象是谁。也就是说你不希望这些对象是紧密耦合的。,Observer模式
18、结构图,观察者模式结构图如下:,Subject(目标):提供注册、删除和通知观察者对象的抽象类(或接口)。,Observer(观察者):为那些在目标发生改变时需要获得通知的具体观察者对象定义一个更新的接口。,ConcreteSubject(具体目标):当它的状态发生变化时,向它的各个观察者发出通知。,ConcreteObserver(具体观察者):实现Observer接口,维护一个ConcreteSubject对象,存储有关状态,随时更新这些状态使得这些状态与目标的状态一致。,Observer模式示例,使用Observer模式,根据取得的随机数来打印不同个数的“*”和“”,具体实现如下:,in
19、terface Observer public abstract void update(NumberObject object);class DigitObserver implements Observer public void update(NumberObject object)System.out.print(DigitObserver:);int count=object.getNumber();for(int i=0;i count;i+)System.out.print();System.out.println();try Thread.sleep(100);catch(In
20、terruptedException e)System.out.println(e);,DigitObserver类根据目标对象的随机数,来打印该随机数个数的“”。GraphObserver类根据目标对象的随机数,来打印该随机数个数的“*”。DigitObserver类和GraphObserver类的实现过程类似,,import java.util.*;abstract class NumberObject/储存Observerprivate Vector observers=new Vector();/新增Observerpublic void addObserver(Observer ob
21、server)observers.add(observer);/删除Observerpublic void deleteObserver(Observer observer)observers.remove(observer);/通知Observer public void notifyObservers()Iterator it=observers.iterator();while(it.hasNext()Observer o=(Observer)it.next();o.update(this);/取得数值 public abstract int getNumber();/产生数值publi
22、c abstract void execute();class RandomNumberObject extends NumberObject private Random random=new Random();/随机数生成器private int number;public int getNumber()/取得数值return number;public void execute()for(int i=0;i 10;i+)number=random.nextInt(30);notifyObservers();/通知Observer,Observer模式优势和不足,该设计模式的优点主要体现在
23、:目标和观察者间的抽象耦合。,因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。在目标上一个看似无误的操作可能会引起一系列对观察者以及依赖于这些观察者的那些对象的更新。另外,如果依赖准则的定义或维护不当,也常常会引起错误的更新,而这种错误通常很难捕捉。,该设计模式的缺点主要体现在:意外的更新可能会导致错误。,一个目标所知道的仅仅是它有一系列观察者,并不知道任何一个观察者属于哪一个具体的类。这样目标和观察者之间的耦合是抽象的和最小的。因为目标和观察者不是紧密耦合的,它们可以属于一个系统中的不同抽象层次。一个处于较低层次的目标对象可与一个处于较高层次的观察者通信并通知它,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 模式 行为
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5637081.html