第6章-行为型模式课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第6章-行为型模式课件.ppt》由会员分享,可在线阅读,更多相关《第6章-行为型模式课件.ppt(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 6 6 章章行为型模式(行为型模式(2 2)本章目标掌握中介者模式的特点及应用掌握观察者模式的特点及应用掌握备忘录模式的特点及应用掌握访问者模式的特点及应用掌握状态模式的特点及应用掌握解释器模式的特点及应用2中介者模式Mediator Pattern 用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显式的相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互中介者模式角色:p抽象中介者(抽象中介者(MediatorMediator)角色:该角色定义出同事对象到中介者对)角色:该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信。象的统一接口,用于各同
2、事角色之间的通信。p具体中介者(具体中介者(Concrete MediatorConcrete Mediator)角色:该角色实现抽象中介者,)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为。它依赖于各个同事角色,并通过协调各同事角色实现协作行为。p抽象同事(抽象同事(ColleagueColleague)角色:该角色定义出中介者到同事对象的)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象。接口,同事对象只知道中介者而不知道其余的同事对象。p具体同事(具体同事(Concrete ColleagueConcrete Col
3、league)角色:该角色实现抽象同事类,)角色:该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的。内的目的。3中介者模式的优缺点中介者模式的优点p减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易维护和理解。得对象之间的关系更易维护和理解。p避免同事对象之间的过度耦合,同事类只依赖于中介者,使同事避免同事对象之间的过度耦合,同事类只依赖于中介者,使同事类更易被复用,中介类和同事类可以相对独立地演化。类更易被复用,中
4、介类和同事类可以相对独立地演化。p中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。上与其他对象的相互作用分开处理。中介者模式的缺点p中介者模式降低了同事对象的复杂性,但增加了中介者类的复杂中介者模式降低了同事对象的复杂性,但增加了中介者类的复杂性。性。p中介者类经常充满了各个具体同事类的关系协调代码,这种代码中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的。是不能复用的。4中介者模式的注意事项不应当在责任划分混乱时使用。通常的情况下,一个初级设计师在面向对象的技术不熟悉时,会使一
5、个系统在责任的分割上发生混乱。责任分割的混乱会使得系统中的对象与对象之间产生不适当的复杂关系。不应当对数据类和方法类使用。初级设计师常常会设计出这样的一种系统,让一系列类只含有数据,另一些类只含有方法。例如,描述一个客户时,这些设计师首先设计出一个叫做客户数据的类,只含有客户数据;另外再设计一个类叫做“管理类”,含有操作客户以及此客户购买公司产品、付账的方法。管理类自然会涉及到其他的类,诸如产品数据类、订单数据类、付账数据类、应收帐数据类等。这不是一种好的设计方式,也不是中介者模式。正确理解封装。封装首先是行为,以及行为所涉及的状态的封装。行为与状态是不应当分割开来的。中介者模式的用途是管理很
6、多的对象的相互作用,以便使这些对象可以专注于自身的行为。5中介者模式实例public interface MarriageAgency void pair(Person person);/为person配对 void register(Person person);/注册会员public abstract class Person String name;/姓名 int age;/年龄 Sex sex;/性别 int requestAge;/要求对象的年龄。对对象只有这一个要求 MarriageAgency agency;/婚姻中介 public Person(String name,int
7、age,Sex sex,int requestAge,MarriageAgency agency)this.name=name;agency.register(this);/注册会员 /寻找对象 public void findPartner()agency.pair(this);enum Sex MALE,FEMALE;public class MarriageAgencyImpl implements MarriageAgency List men=new ArrayList();/男会员 List women=new ArrayList();/女会员 public void regist
8、er(Person person)if(person.sex=Sex.MALE)men.add(Man)person);else if(person.sex=Sex.FEMALE)women.add(Woman)person);public void pair(Person person)if(person.sex=Sex.MALE)for(Woman w:women)if(w.age=person.requestAge)System.out.println(person.name+和+w.name+配对成功);return;else if(person.sex=Sex.FEMALE)for(
9、Man m:men)if(m.age=person.requestAge)System.out.println(person.name+和+m.name+配对成功);return;System.out.println(没有为+person.name+找到合适的对象);public class Man extends Person public Man(String name,int age,int requestAge,MarriageAgency agency)super(name,age,Sex.MALE,requestAge,agency);public class Woman exte
10、nds Person public Man(String name,int age,int requestAge,MarriageAgency agency)super(name,age,Sex.FAMALE,requestAge,agency);public class Test public static void main(String args)MarriageAgency agency=new MarriageAgencyImpl();Person m1=new Man(John,20,18,agency);Person m2=new Man(Mike,27,25,agency);P
11、erson w1=new Woman(Mary,25,27,agency);Person w2=new Woman(Jane,20,22,agency);m1.findPartner();m2.findPartner();6观察者模式Observer Pattern 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新观察者模式角色:p抽象主题(抽象主题(SubjectSubject)角色:该角色又称为)角色:该角色又称为“被观察者被观察者”,可以,可以增加和删除观察者对象。增加和删除观察者对象。p抽象观察者(抽象观察者(ObserverObs
12、erver)角色:该角色为所有的具体观察者定义)角色:该角色为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。一个接口,在得到主题的通知时更新自己。p具体主题(具体主题(Concrete SubjectConcrete Subject)角色:该角色又称为)角色:该角色又称为“具体被观具体被观察者察者”,它将有关状态存入具体观察者对象,在具体主题的内部,它将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知。状态改变时,给所有登记过的观察者发出通知。p具体观察者(具体观察者(Concrete ObserverConcrete Observer)角色:该
13、角色实现抽象观察)角色:该角色实现抽象观察者所要求的更新接口,以便使自身的状态与主题的状态相协调。者所要求的更新接口,以便使自身的状态与主题的状态相协调。7观察者模式的优点观察者模式的优点p观察者和被观察者之间是抽象耦合。被观察者角色所知道的只是观察者和被观察者之间是抽象耦合。被观察者角色所知道的只是一个具体观察者集合,每一个具体观察者都符合一个抽象观察者一个具体观察者集合,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体的观察者,它只知道它的接口。被观察者并不认识任何一个具体的观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密的耦合们都有一个共同的接
14、口。由于被观察者和观察者没有紧密的耦合在一起,因此它们可以属于不同的抽象化层次,且都非常容易扩在一起,因此它们可以属于不同的抽象化层次,且都非常容易扩展。展。p支持广播通信。被观察者会向所有的登记过的观察者发出通知,支持广播通信。被观察者会向所有的登记过的观察者发出通知,这就是一个触发机制,形成一个触发链。这就是一个触发机制,形成一个触发链。8观察者模式的缺点观察者模式的缺点p如果一个主题有多个直接或间接的观察者,则通知所有的观察者如果一个主题有多个直接或间接的观察者,则通知所有的观察者会花费很多时间,且开发和调试都比较复杂。会花费很多时间,且开发和调试都比较复杂。p如果在主题之间有循环依赖的
15、话,被观察者会触发它们之间进行如果在主题之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式时要特别注意这一循环调用,导致系统崩溃。在使用观察者模式时要特别注意这一点。点。p如果对观察者的通知是通过另外的线程进行异步投递的话,系统如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递的顺序执行。必须保证投递的顺序执行。p虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有提供相应的机制使观察者知道所观察的对象但是观察者模式没有提供相应的机制使观察者知道所观察的对象是
16、怎么发生变化。是怎么发生变化。9观察者模式的应用场景和注意事项观察者模式的应用场景p关联行为场景。关联行为场景。p事件多级触发场景。事件多级触发场景。p跨系统的消息交换场景,如消息队列的处理机制。跨系统的消息交换场景,如消息队列的处理机制。观察者模式的注意事项p广播链的问题。一个观察者可以有双重身份,既是观察者也是被广播链的问题。一个观察者可以有双重身份,既是观察者也是被观察者,广播链一旦建立,逻辑就比较复杂,可维护性非常差。观察者,广播链一旦建立,逻辑就比较复杂,可维护性非常差。一般在一个观察者模式中最多出现一个对象既是观察者也是被观一般在一个观察者模式中最多出现一个对象既是观察者也是被观察
17、者,这样消息最多转发一次(传递两次),较易控制。察者,这样消息最多转发一次(传递两次),较易控制。p异步处理的问题。异步处理就要考虑线程安全和队列的问题。异步处理的问题。异步处理就要考虑线程安全和队列的问题。10观察者模式实例public interface Clickable /点击 void click();/添加点击事件的观察者 void addClickableObserver(ClickableObserver observer);/移除点击事件的观察者 void removeClickableObserver(ClickableObserver observer);public i
18、nterface ClickableObserver /发生点击事件时的操作 void clicked(Clickable clickable);public class Button implements Clickable /存储注册过的点击事件观察者 List observers=new ArrayList();/按钮信息 String color;/颜色 int x,y;/坐标 public void click()System.out.println(按钮被点击);/执行所有观察者的事件处理方法 for(int i=observers.size()-1;i=0;i-)observer
19、s.get(i).clicked(this);public void addClickableObserver(ClickableObserver observer)observers.add(observer);public void removeClickableObserver(ClickableObserver observer)observers.remove(observer);public String toString()return 按钮颜色:+color+,坐标:+x+,+y;public class ChangeColorObserver implements Click
20、ableObserver Override public void clicked(Clickable clickable)Button b=(Button)clickable;b.color=红色;public class ChangeCoordinateObserver implements ClickableObserver Override public void clicked(Clickable clickable)Button b=(Button)clickable;b.x=100;b.y=90;public class OtherObserver implements Clic
21、kableObserver Override public void clicked(Clickable clickable)System.out.println(执行其它操作.);public class Test public static void main(String args)Button button=new Button();button.color=白色;button.x=0;button.y=0;button.addClickableObserver(new ChangeColorObserver();button.addClickableObserver(new Chan
22、geCoordinateObserver();button.addClickableObserver(new OtherObserver();button.click();System.out.println(button);11备忘录模式Memento Pattern 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态备忘录模式角色:p发起人(发起人(OriginatorOriginator)角色:该角色记录当前时刻的内部状态,)角色:该角色记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘数据。负责定
23、义哪些属于备份范围的状态,负责创建和恢复备忘数据。p备忘录(备忘录(MementoMemento)角色:该角色负责存储发起人角色的内部状)角色:该角色负责存储发起人角色的内部状态,在需要时提供发起人需要的内部状态数据。态,在需要时提供发起人需要的内部状态数据。p负责人(负责人(CaretakerCaretaker)角色:该角色对备忘录角色进行管理、保)角色:该角色对备忘录角色进行管理、保存和提供备忘录。存和提供备忘录。12备忘录模式的应用场景和注意事项备忘录模式的应用场景p需要保存和恢复数据的相关状态场景。需要保存和恢复数据的相关状态场景。p提供一个可回滚的操作。提供一个可回滚的操作。p需要监
24、控副本的场景中。例如,监控一个对象的属性,但是监控需要监控副本的场景中。例如,监控一个对象的属性,但是监控又不应该作为系统的主业务来调用,它只是边缘应用,即使出现又不应该作为系统的主业务来调用,它只是边缘应用,即使出现监控不准、错误报警也影响不大,因此一般做法是备份一个主线监控不准、错误报警也影响不大,因此一般做法是备份一个主线程中的对象,然后由分析程序来分析。程中的对象,然后由分析程序来分析。p数据库连接的事务管理使用的就是备忘录模式。数据库连接的事务管理使用的就是备忘录模式。备忘录模式的注意事项p备忘录的生命周期,备忘录创建出来就要在最近的代码中使用,备忘录的生命周期,备忘录创建出来就要在
25、最近的代码中使用,要主动管理它的生命周期,建立就要使用,不使用就要立刻删除要主动管理它的生命周期,建立就要使用,不使用就要立刻删除其引用,等待垃圾回收器对它的回收处理。其引用,等待垃圾回收器对它的回收处理。p备忘录的性能。不要在频繁建立备份的场景中使用备忘录模式,备忘录的性能。不要在频繁建立备份的场景中使用备忘录模式,例如例如forfor循环中,一是控制不了备忘录建立的对象数量;二是大循环中,一是控制不了备忘录建立的对象数量;二是大对象的建立是要消耗资源的。系统的性能需要考虑。因此,如果对象的建立是要消耗资源的。系统的性能需要考虑。因此,如果出现这样的代码,设计师应该修改架构。出现这样的代码,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 行为 模式 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内