第6章-行为型模式课件.ppt

上传人(卖家):ziliao2023 文档编号:5874413 上传时间:2023-05-13 格式:PPT 页数:27 大小:2.19MB
下载 相关 举报
第6章-行为型模式课件.ppt_第1页
第1页 / 共27页
第6章-行为型模式课件.ppt_第2页
第2页 / 共27页
第6章-行为型模式课件.ppt_第3页
第3页 / 共27页
第6章-行为型模式课件.ppt_第4页
第4页 / 共27页
第6章-行为型模式课件.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、第第 6 6 章章行为型模式(行为型模式(2 2)本章目标掌握中介者模式的特点及应用掌握观察者模式的特点及应用掌握备忘录模式的特点及应用掌握访问者模式的特点及应用掌握状态模式的特点及应用掌握解释器模式的特点及应用中介者模式Mediator Pattern 用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显式的相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互中介者模式角色:p 抽象中介者(抽象中介者(MediatorMediator)角色:该角色定义出同事对象到中介者对)角色:该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信。象的统一接口,用于各同

2、事角色之间的通信。p 具体中介者(具体中介者(Concrete MediatorConcrete Mediator)角色:该角色实现抽象中介者,)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为。它依赖于各个同事角色,并通过协调各同事角色实现协作行为。p 抽象同事(抽象同事(ColleagueColleague)角色:该角色定义出中介者到同事对象的)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象。接口,同事对象只知道中介者而不知道其余的同事对象。p 具体同事(具体同事(Concrete ColleagueConcrete

3、Colleague)角色:该角色实现抽象同事类,)角色:该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的。内的目的。中介者模式的优缺点中介者模式的优点p 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易维护和理解。得对象之间的关系更易维护和理解。p 避免同事对象之间的过度耦合,同事类只依赖于中介者,使同事避免同事对象之间的过度耦合,同事类只依赖于中介者,使同事类更易被复用,中介类和同事类可以相对独立地演化。类更易被

4、复用,中介类和同事类可以相对独立地演化。p 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。上与其他对象的相互作用分开处理。中介者模式的缺点p 中介者模式降低了同事对象的复杂性,但增加了中介者类的复杂中介者模式降低了同事对象的复杂性,但增加了中介者类的复杂性。性。p 中介者类经常充满了各个具体同事类的关系协调代码,这种代码中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的。是不能复用的。中介者模式的注意事项不应当在责任划分混乱时使用。通常的情况下,一个初级设计师在面向对象的技术不熟

5、悉时,会使一个系统在责任的分割上发生混乱。责任分割的混乱会使得系统中的对象与对象之间产生不适当的复杂关系。不应当对数据类和方法类使用。初级设计师常常会设计出这样的一种系统,让一系列类只含有数据,另一些类只含有方法。例如,描述一个客户时,这些设计师首先设计出一个叫做客户数据的类,只含有客户数据;另外再设计一个类叫做“管理类”,含有操作客户以及此客户购买公司产品、付账的方法。管理类自然会涉及到其他的类,诸如产品数据类、订单数据类、付账数据类、应收帐数据类等。这不是一种好的设计方式,也不是中介者模式。正确理解封装。封装首先是行为,以及行为所涉及的状态的封装。行为与状态是不应当分割开来的。中介者模式的

6、用途是管理很多的对象的相互作用,以便使这些对象可以专注于自身的行为。中介者模式实例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

7、,int 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 r

8、egister(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

9、)for(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

10、 extends 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,agen

11、cy);Person w1=new Woman(Mary,25,27,agency);Person w2=new Woman(Jane,20,22,agency);m1.findPartner();m2.findPartner();观察者模式Observer Pattern 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新观察者模式角色:p 抽象主题(抽象主题(SubjectSubject)角色:该角色又称为)角色:该角色又称为“被观察者被观察者”,可以,可以增加和删除观察者对象。增加和删除观察者对象。p 抽象观察者(抽象观察者(Obser

12、verObserver)角色:该角色为所有的具体观察者定义)角色:该角色为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。一个接口,在得到主题的通知时更新自己。p 具体主题(具体主题(Concrete SubjectConcrete Subject)角色:该角色又称为)角色:该角色又称为“具体被观具体被观察者察者”,它将有关状态存入具体观察者对象,在具体主题的内部,它将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知。状态改变时,给所有登记过的观察者发出通知。p 具体观察者(具体观察者(Concrete ObserverConcrete Obser

13、ver)角色:该角色实现抽象观察)角色:该角色实现抽象观察者所要求的更新接口,以便使自身的状态与主题的状态相协调。者所要求的更新接口,以便使自身的状态与主题的状态相协调。观察者模式的优点观察者模式的优点p 观察者和被观察者之间是抽象耦合。被观察者角色所知道的只是观察者和被观察者之间是抽象耦合。被观察者角色所知道的只是一个具体观察者集合,每一个具体观察者都符合一个抽象观察者一个具体观察者集合,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体的观察者,它只知道它的接口。被观察者并不认识任何一个具体的观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密的耦合们

14、都有一个共同的接口。由于被观察者和观察者没有紧密的耦合在一起,因此它们可以属于不同的抽象化层次,且都非常容易扩在一起,因此它们可以属于不同的抽象化层次,且都非常容易扩展。展。p 支持广播通信。被观察者会向所有的登记过的观察者发出通知,支持广播通信。被观察者会向所有的登记过的观察者发出通知,这就是一个触发机制,形成一个触发链。这就是一个触发机制,形成一个触发链。观察者模式的缺点观察者模式的缺点p 如果一个主题有多个直接或间接的观察者,则通知所有的观察者如果一个主题有多个直接或间接的观察者,则通知所有的观察者会花费很多时间,且开发和调试都比较复杂。会花费很多时间,且开发和调试都比较复杂。p 如果在

15、主题之间有循环依赖的话,被观察者会触发它们之间进行如果在主题之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式时要特别注意这一循环调用,导致系统崩溃。在使用观察者模式时要特别注意这一点。点。p 如果对观察者的通知是通过另外的线程进行异步投递的话,系统如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递的顺序执行。必须保证投递的顺序执行。p 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有提供相应的机制使观察者知道所观察的对象但是观察者模式没有提供相应的机制使

16、观察者知道所观察的对象是怎么发生变化。是怎么发生变化。观察者模式的应用场景和注意事项观察者模式的应用场景p 关联行为场景。关联行为场景。p 事件多级触发场景。事件多级触发场景。p 跨系统的消息交换场景,如消息队列的处理机制。跨系统的消息交换场景,如消息队列的处理机制。观察者模式的注意事项p 广播链的问题。一个观察者可以有双重身份,既是观察者也是被广播链的问题。一个观察者可以有双重身份,既是观察者也是被观察者,广播链一旦建立,逻辑就比较复杂,可维护性非常差。观察者,广播链一旦建立,逻辑就比较复杂,可维护性非常差。一般在一个观察者模式中最多出现一个对象既是观察者也是被观一般在一个观察者模式中最多出

17、现一个对象既是观察者也是被观察者,这样消息最多转发一次(传递两次),较易控制。察者,这样消息最多转发一次(传递两次),较易控制。p 异步处理的问题。异步处理就要考虑线程安全和队列的问题。异步处理的问题。异步处理就要考虑线程安全和队列的问题。观察者模式实例public interface Clickable /点击 void click();/添加点击事件的观察者 void addClickableObserver(ClickableObserver observer);/移除点击事件的观察者 void removeClickableObserver(ClickableObserver obse

18、rver);public interface 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

19、=0;i-)observers.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 im

20、plements ClickableObserver 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 i

21、mplements ClickableObserver 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.addClickableObs

22、erver(new ChangeCoordinateObserver();button.addClickableObserver(new OtherObserver();button.click();System.out.println(button);备忘录模式Memento Pattern 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态备忘录模式角色:p 发起人(发起人(OriginatorOriginator)角色:该角色记录当前时刻的内部状态,)角色:该角色记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责

23、创建和恢复备忘数据。负责定义哪些属于备份范围的状态,负责创建和恢复备忘数据。p 备忘录(备忘录(MementoMemento)角色:该角色负责存储发起人角色的内部状)角色:该角色负责存储发起人角色的内部状态,在需要时提供发起人需要的内部状态数据。态,在需要时提供发起人需要的内部状态数据。p 负责人(负责人(CaretakerCaretaker)角色:该角色对备忘录角色进行管理、保)角色:该角色对备忘录角色进行管理、保存和提供备忘录。存和提供备忘录。备忘录模式的应用场景和注意事项备忘录模式的应用场景p 需要保存和恢复数据的相关状态场景。需要保存和恢复数据的相关状态场景。p 提供一个可回滚的操作。

24、提供一个可回滚的操作。p 需要监控副本的场景中。例如,监控一个对象的属性,但是监控需要监控副本的场景中。例如,监控一个对象的属性,但是监控又不应该作为系统的主业务来调用,它只是边缘应用,即使出现又不应该作为系统的主业务来调用,它只是边缘应用,即使出现监控不准、错误报警也影响不大,因此一般做法是备份一个主线监控不准、错误报警也影响不大,因此一般做法是备份一个主线程中的对象,然后由分析程序来分析。程中的对象,然后由分析程序来分析。p 数据库连接的事务管理使用的就是备忘录模式。数据库连接的事务管理使用的就是备忘录模式。备忘录模式的注意事项p 备忘录的生命周期,备忘录创建出来就要在最近的代码中使用,备

25、忘录的生命周期,备忘录创建出来就要在最近的代码中使用,要主动管理它的生命周期,建立就要使用,不使用就要立刻删除要主动管理它的生命周期,建立就要使用,不使用就要立刻删除其引用,等待垃圾回收器对它的回收处理。其引用,等待垃圾回收器对它的回收处理。p 备忘录的性能。不要在频繁建立备份的场景中使用备忘录模式,备忘录的性能。不要在频繁建立备份的场景中使用备忘录模式,例如例如forfor循环中,一是控制不了备忘录建立的对象数量;二是大循环中,一是控制不了备忘录建立的对象数量;二是大对象的建立是要消耗资源的。系统的性能需要考虑。因此,如果对象的建立是要消耗资源的。系统的性能需要考虑。因此,如果出现这样的代码

26、,设计师应该修改架构。出现这样的代码,设计师应该修改架构。备忘录模式实例public class Document String content;/需备份的状态 String otherContent;/无需备份的状态 /保存为一个备份 public Backup save()System.out.println(保存备份);return new Backup(content);/恢复为某个状态 public void resume(Backup backup)System.out.println(恢复备份);content=backup.content;Override public Str

27、ing toString()return content:+content +,otherContent:+otherContent;public class Backup String content;/备份的内容 int version;/版本 public Backup(String content)this.content=content;public class VersionControlSystem LinkedList backups=new LinkedList();/所有的备份 int nextVersion;/下一个版本 /添加备份 public void add(Bac

28、kup backup)backup.version=+nextVersion;backups.add(backup);/取得某个版本的备份 public Backup get(int version)for(Backup backup:backups)if(backup.version=version)return backup;return null;/取得最后一个版本的备份 public Backup getLastVersion()return backups.getLast();public class Test public static void main(String args)

29、VersionControlSystem vcs=new VersionControlSystem();Document document=new Document();document.content=content1;document.otherContent=otherContent1;System.out.println(document);vcs.add(document.save();/保存备份 document.content=content2;document.otherContent=otherContent2;System.out.println(document);vcs

30、.add(document.save();/保存备份 document.content=content3;document.otherContent=otherContent3;System.out.println(document);document.resume(vcs.get(1);/恢复版本1 System.out.println(document);document.resume(vcs.getLastVersion();/恢复最新版本 System.out.println(document);访问者模式Visitor Pattern 封装一些作用于某种数据结构中的各元素的操作,它可

31、以在不改变数据结构的前提下定义作用于这些元素的新的操作访问者模式角色:p 抽象访问者(抽象访问者(VisitorVisitor)角色:该角色声明一个或多个访问操作,)角色:该角色声明一个或多个访问操作,定义访问者可以访问哪些元素。定义访问者可以访问哪些元素。p 具体访问者(具体访问者(Concrete VisitorConcrete Visitor)角色:该角色实现抽象访问者)角色:该角色实现抽象访问者角色中的各个访问操作。角色中的各个访问操作。p 抽象元素(抽象元素(ElementElement)角色:该角色声明一个接受操作,接受一)角色:该角色声明一个接受操作,接受一个访问者对象。个访问者

32、对象。p 具体元素(具体元素(Concrete ElementConcrete Element)角色:该角色实现抽象元素中的)角色:该角色实现抽象元素中的接受操作。接受操作。p 结构对象(结构对象(Object StructureObject Structure)角色:该角色有以下责任,可以)角色:该角色有以下责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素,也可以设计一个复合对象或者一问者对象可以访问每一个元素,也可以设计一个复合对象或者一个集合,如个集合,如ListList或或SetSet。

33、访问者模式的优点访问者模式的优点p 访问者模式使得增加新的操作变得很容易,增加新的操作只需增访问者模式使得增加新的操作变得很容易,增加新的操作只需增加新的访问者类。加新的访问者类。p 访问者模式将有关的行为集中到一个访问者对象中,而不是分散访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个元素类中。到一个个元素类中。p 访问者模式可以跨过几个类的等级结构访问属于不同的等级结构访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。的成员类。p 累积状态。每一个单独的访问者对象都集中了相关的行为,从而累积状态。每一个单独的访问者对象都集中了相关的行为,从而也就可以在访问的

34、过程中将执行操作的状态积累在自己内部,而也就可以在访问的过程中将执行操作的状态积累在自己内部,而不是分散到很多的元素对象中,益于系统的维护。不是分散到很多的元素对象中,益于系统的维护。访问者模式的缺点访问者模式的缺点p 增加新的元素类变得很困难。每增加一个新的元素类都意味着要增加新的元素类变得很困难。每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作。问者类中增加相应的具体操作。p 破坏封装。访问者模式要求访问者对象访问并调用每一个元素对破坏封装。访问者模式要求访问者对象访问并

35、调用每一个元素对象的操作,这隐含了一个对所有元素对象的要求,即必须暴露一象的操作,这隐含了一个对所有元素对象的要求,即必须暴露一些自己的操作和内部状态,否则访问者的访问就变得没有意义。些自己的操作和内部状态,否则访问者的访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使得这些由于访问者对象自己会积累访问操作所需的状态,从而使得这些状态不再存储在元素对象中,破坏了类的封装性。状态不再存储在元素对象中,破坏了类的封装性。p 违背了依赖倒置原则。访问者依赖的是具体的元素,而不是抽象违背了依赖倒置原则。访问者依赖的是具体的元素,而不是抽象的元素,这破坏了依赖倒置的原则,特别是在面向

36、对象的编程中,的元素,这破坏了依赖倒置的原则,特别是在面向对象的编程中,抛弃了对接口的依赖,而直接依赖实现类,扩展比较难。抛弃了对接口的依赖,而直接依赖实现类,扩展比较难。访问者模式的应用场景访问者模式的应用场景p 一个对象结构包含很多类对象,它们有不同的接口,当对这些对一个对象结构包含很多类对象,它们有不同的接口,当对这些对象实施依赖于具体类的操作时,即使用迭代器模式不能胜任的场象实施依赖于具体类的操作时,即使用迭代器模式不能胜任的场景下,可以采用访问者模式。景下,可以采用访问者模式。p 需要对一个对象结构中的对象进行很多不同并且不相关的操作,需要对一个对象结构中的对象进行很多不同并且不相关

37、的操作,避免操作污染类。避免操作污染类。p 业务规则要求遍历多个不同的对象,这本身也是访问者模式的出业务规则要求遍历多个不同的对象,这本身也是访问者模式的出发点,迭代器模式只能访问同类或同接口的数据,而访问者模式发点,迭代器模式只能访问同类或同接口的数据,而访问者模式是对迭代器模式的扩充,可以遍历不同的对象,执行不同的操作。是对迭代器模式的扩充,可以遍历不同的对象,执行不同的操作。访问者模式实例public abstract class Hardware String type;/型号 public Hardware(String type)this.type=type;public Stri

38、ng getType()return type;/运转 public abstract void run();/接受计算机访问者 public abstract void accept(ComputerVisitor computerVisitor);public interface ComputerVisitor void vistCPU(CPU cpu);/访问CPU void vistHarddisk(Harddisk harddisk);/访问硬盘public class CPU extends Hardware public CPU(String type)super(type);p

39、ublic void run()System.out.println(型号为+type+的CPU正在运转);public void accept(ComputerVisitor computerVisitor)computerVisitor.vistCPU(this);public class Harddisk extends Hardware public Harddisk(String type)super(type);public void run()System.out.println(型号为+type+的硬盘正在运转);public void accept(ComputerVisit

40、or computerVisitor)computerVisitor.vistHarddisk(this);public class TypeVisitor implements ComputerVisitor public void vistCPU(CPU cpu)System.out.println(CPU型号:+cpu.getType();public void vistHarddisk(Harddisk harddisk)System.out.println(硬盘型号:+harddisk.getType();public class RunVisitor implements Comp

41、uterVisitor public void vistCPU(CPU cpu)cpu.run();public void vistHarddisk(Harddisk harddisk)harddisk.run();public class Computer private Hardware cpu;private Hardware harddisk;public Computer()this.cpu=new CPU(Intel Core i7-620);this.harddisk=new Harddisk(Seagate 500G 7200转);public void accept(Comp

42、uterVisitor computerVisitor)cpu.accept(computerVisitor);harddisk.accept(computerVisitor);public class ClientDemo public static void main(String args)Computer computer=new Computer();ComputerVisitor typeVisitor=new TypeVisitor();ComputerVisitor runVisitor=new RunVisitor();computer.accept(typeVisitor)

43、;System.out.println(-);computer.accept(runVisitor);状态模式State Pattern 当一个对象内在状态改变时允许改变行为,这个对象看起来像改变了其类型状态模式3个角色:p 抽象状态(抽象状态(StateState)角色:该角色用以封装环境对象的一个特定)角色:该角色用以封装环境对象的一个特定的状态所对应的行为。的状态所对应的行为。p 具体状态(具体状态(Concrete StateConcrete State)角色:该角色实现环境的一个状态)角色:该角色实现环境的一个状态所对应的行为。所对应的行为。p 环境(环境(ContextContex

44、t)角色:该角色定义客户端需要的接口,并负责)角色:该角色定义客户端需要的接口,并负责具体状态的切换。它会保留一个具体状态类的实例,该实例给出具体状态的切换。它会保留一个具体状态类的实例,该实例给出环境对象的现有状态。环境对象的现有状态。状态模式的优缺点和应用场景状态模式的优点p 结构清晰。结构清晰。p 遵循设计原则。遵循设计原则。p 封装性非常好。封装性非常好。状态模式的应用场景p 对象的行为依赖于它所处的状态,即行为随状态改变而改变的场对象的行为依赖于它所处的状态,即行为随状态改变而改变的场景。景。p 对象在某个方法里依赖于一重或多重条件分支语句,此时可以使对象在某个方法里依赖于一重或多重

45、条件分支语句,此时可以使用状态模式将分支语句中的每一个分支都包装到一个单独的类中,用状态模式将分支语句中的每一个分支都包装到一个单独的类中,使得这些条件分支语句能够以类的方式独立存在和演化。如此,使得这些条件分支语句能够以类的方式独立存在和演化。如此,维护这些独立的类就不再影响到系统的其他部分。维护这些独立的类就不再影响到系统的其他部分。状态模式的缺点p 子类太多,不易管理子类太多,不易管理状态模式实例/频道(抽象状态)public interface Channel /播放频道中的节目 public void display();public class CCTV1 implements C

46、hannel public void display()System.out.println(CCTV1 新闻联播);public class CCTV2 implements Channel public void display()System.out.println(“CCTV2 经济半小时);public class CCTV3 implements Channel public void display()System.out.println(“CCTV3 非常6+1);/电视public class TV /电视可以看的频道(状态)public final static Chann

47、el CCTV1=new CCTV1();public final static Channel CCTV2=new CCTV2();public final static Channel CCTV3=new CCTV3();private Channel channel;/当前频道 public void setChannel(Channel channel)this.channel=channel;/设置频道 public void disCCTV1()this.setChannel(CCTV1);/播放CCTV1频道 this.channel.display();public void

48、disCCTV2()this.setChannel(CCTV2);/播放CCTV2频道 this.channel.display();public void disCCTV3()this.setChannel(CCTV3);/播放CCTV3频道 this.channel.display();public class Test public static void main(String args)TV tv=new TV();/换台 tv.disCCTV2();tv.disCCTV3();tv.disCCTV1();解释器模式Interpreter Pattern 给定一门语言,定义它的文法的

49、一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子解释器模式5个角色:p 抽象表达式(抽象表达式(Abstract ExpressionAbstract Expression)角色:该角色声明一个所)角色:该角色声明一个所有的具体表达式角色都需要实现的抽象接口,该接口主要是一个有的具体表达式角色都需要实现的抽象接口,该接口主要是一个解释操作解释操作interpret()interpret()方法。方法。p 终结符表达式(终结符表达式(Terminal ExpressionTerminal Expression)角色:该角色实现了抽)角色:该角色实现了抽象表达式角色所要求的接口,文

50、法中的每一个终结符都有一个具象表达式角色所要求的接口,文法中的每一个终结符都有一个具体终结表达式与之相对应。体终结表达式与之相对应。p 非终结符表达式(非终结符表达式(NonterminalNonterminal Expression Expression)角色:该角色是一)角色:该角色是一个具体角色,文法中的每一条规则都对应一个非终结符表达式类。个具体角色,文法中的每一条规则都对应一个非终结符表达式类。p 环境(环境(ContextContext)角色:该角色提供解释器之外的一些全局信息。)角色:该角色提供解释器之外的一些全局信息。p 客户端(客户端(ClientClient)角色:该角色创

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第6章-行为型模式课件.ppt)为本站会员(ziliao2023)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|