3.3.3 Observer(观察者):适用性与参与者适用性:
1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。参与者:? Subject(目标)
—目标知道它的观察者。可以有任意多个观察者观察同一个目标。—提供注册和删除观察者对象的接口。
3.3.3Observer模式的UML类图
12108列6列列420行 1行 2行 3行 4 1 2 33.3.4 Template method(模板方法)—对象行为型模式1. 意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2. 动机
考虑一个提供A p p l i c a t i o n和D o c u m e n t类的应用框架。A p p l i c a t i o n类负责打开一个已有的以外部形式存储的文档,如一个文件。一旦一个文档中的信息从该文件中读出后,它就由一个Document对象表示。
抽象的Application类在它的OpenDocument操作中定义了打开和读取一个文档的每一个主要步骤。它检查该文档是否能被打开,创建与应用相关的D o c u m e n t对象,将它加到它入的文档集合中,并且从一个文件中读取该Document。我们称O p e n D o c u m e n t为一个模板方法(template method)。一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些
3.3.4 Template method:适用性和参与者
适用性:
? 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
? 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。即“重分解以一般化”,首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
●控制子类扩展。模板方法只在特定点调用“Hook Method(钩子方法)”操作,这样就只允许在这些点进行扩展。
参与者:
? AbstractClass(抽象类,如Application)
—定义抽象的原语操作( primitive operation),具体的子类将重定义它们以实现一个算法。
? ConcreteClass(具体类,如MyApplication)
—实现原语操作以完成算法中与特定子类相关的步骤。