|
|
|
| 您的位置:首页>>设计模式>>强制聚合模式(Aggregatenbsp;Enforcer) |
|
|
强制聚合模式(Aggregatenbsp;Enforcer)
|
| 2007-04-13 来源:www.javaresearch.org 作者:未知 |
第27章 强制聚合模式(Aggregate Enforcer)
描述: 通常,类被设计为既可以保持相关的数据又可以提供特定的功能。有时,一个类可以包含其他的类作为自己的一部分。像这样由其他的对象组合而成的对象叫做聚合对象。例如,computer是一个聚合对象,它是由诸如cpu和内存这样的对象。强制聚合模式(Aggregate Enforcer Pattern)建议当构建聚合对象时,必须创建所有的它所包含的对象。也就是当一个聚合类被初始化,所有的代表组成对象的成员变量必须被初始化。这种思想确保聚合对象的全部被创建或都不被创建。 有两种类型的聚合关系??聚合和组成。这两种关系,都是一个聚合对象由几个组成对象构成。 对于聚合,是当父聚合对象不存在时,组成聚合对象部分可以存在。而组成则是一种强聚合,在组成关系中,当父聚合对象不存在时,它的组成对象不能存在。 代表组成对象的成员变量可以在创建聚合对象的时候被创建(early initialization)或者是在需要使用这个变量的时候创建(on demand)。先期初始化(early initialization)组成对象由下面的优点: (1) 聚合对象总是被作为组成对象的组合。也就是说,组成聚合对象的对象不存在,那么聚合对象也就不能存在。因此,遵从于聚合对象的语意,要创建聚合对象,必须初始化组成它的全部组成对象。 (2) 先期初始化(early initialization)可以在创建父聚合对象时,暴露任何的创建组成对象的问题。 (3) 所有的客户对象和在聚合对象内部不同对象的方法中,都可以认定代表组成对象的成员变量已经全部被初始化。这就减少了成员变量是否被初始化的条件语句的判断。 例子: 让我们设计一个代表特定计算机聚合类,CPU类是它的组成部分。如图27.1 Figure 27.1: Computer Class Representation as an Aggregate
设计方法I(按需初始化)Design Approach I (On-Demand Initialization) 对象变量CPU在当需要它时,才进行初始化。 从Computer类的设计中可以看到,任何的对cpu对象引用变量的访问,都需要检测以确保对象引用变量被适当的初始化。因为不能保证cpu变量被初始化,因此这个检测对于防止潜在的运行期错误是至关重要的。 Listing 27.1: Computer Class (On-Demand Initialization)
- public class Computer {
- //Constituting Object
- private CPU cpu;
- private String name;
- //Constructor
- public Computer(String n) {
- name = n;
- }
- public boolean start() {
- //…
- initCPU();
- System.out.println("CPU activated");
- return true;
- }
- public boolean executeTask() {
- //…
- initCPU();
- System.out.println("CPU is Executing the Task");
- return true;
- }
- public boolean stop() {
- //…
- initCPU();
- System.out.println("CPU is stopped");
- return true;
- }
- private void initCPU() {
- if (cpu == null) {
- cpu = new CPU("Intel");
- }
- }
- }
- class CPU {
- private String name;
- public CPU(String n) {
- name = n;
- }
- }
设计方法II(先期初始化) Design Approach II (Early Initialization) 在构造函数中初始化cpu对象引用变量,消除了对成员变量是否被初始化的检测。 Listing 27.2: Computer Class (Early Initialization)
- public class Computer {
- //Constituting Object
- private CPU cpu;
- private String name;
- //Constructor
- public Computer(String n) {
- name = n;
- cpu = new CPU("Intel");
- }
- public boolean start() {
- //…
- System.out.println("CPU activated");
- return true;
- }
- …
- …
- }
这样做不需要对null值进行检测。但是,在聚合对象Computer创建的时候, cpu成员变量也不总是被初始化。换句话说,即使它不需要进行null值检测,但是通过初始化cpu变量来创建聚合类Computer的实例这并不是绝对的。Computer这个类必须被设计成在它的构造函数里进行强制初始化。通常,需要强制初始化代表聚合对象的组成对象。 设计方法(Final 变量)III Design Approach III (Final Variables) 下面的代码对于成员变量cpu有了小小的改变。在Java中,声明成员变量为final以确保它作为构造对象的一部分进行初始化。如图27.2,编译器直到完全初始化它的所有的final变量后,才编译这个类。 Listing 27.3: Computer Class?Revised
- public class Computer {
- //Constituting Object
- private final CPU cpu;
- private String name;
- //Constructor
- public Computer(String n) {
- name = n;
- cpu = new CPU("Intel");
- }
- public boolean start() {
- //…
- System.out.println("CPU activated");
- return true;
- }
- public boolean executeTask() {
- //…
- System.out.println("CPU is Executing the Task");
- return true;
- }
- public boolean stop() {
- //…
- System.out.println("CPU is stopped");
- return true;
- }
- }
- class CPU {
- private String name;
- public CPU(String n) {
- name = n;
- }
- }
-
Figure 27.2: Revised Computer Class Representation as an Aggregate 因为可以确保成员变量被初始化,不同的方法可以消除对变量的初始化。 例子中的构建的聚合对象的组成对象是一个单一的、小对象。有时,聚合对象可能由很多大的、复杂的对象组成。这就会导致在创建聚合对象时,创建所有的它的组合对象的代价很大。这种情况下,根据虚拟代理模式可以对每一个组成对象设计一个相应的代理对象。
附件为原文! 附件:Chapter_27.doc(69K) 附件:31.rar(3K)
|
|
|
| |