Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>设计模式>>强制聚合模式(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) 
  1. public class Computer { 
  2.   //Constituting Object 
  3.   private CPU cpu; 
  4.   private String name; 
  5.   //Constructor 
  6.   public Computer(String n) { 
  7.     name = n; 
  8.   } 
  9.   public boolean start() { 
  10.     //… 
  11.     initCPU(); 
  12.     System.out.println("CPU activated"); 
  13.     return true
  14.   } 
  15.   public boolean executeTask() { 
  16.     //… 
  17.     initCPU(); 
  18.     System.out.println("CPU is Executing the Task"); 
  19.     return true
  20.   } 
  21.   public boolean stop() { 
  22.     //… 
  23.     initCPU(); 
  24.     System.out.println("CPU is stopped"); 
  25.     return true
  26.   } 
  27.   private void initCPU() { 
  28.     if (cpu == null) { 
  29.      cpu = new CPU("Intel"); 
  30.     } 
  31.   } 
  32. class CPU { 
  33.  private String name; 
  34.  public CPU(String n) { 
  35.    name = n; 
  36.  } 

设计方法II(先期初始化) 

Design Approach II (Early Initialization)
    在构造函数中初始化cpu对象引用变量,消除了对成员变量是否被初始化的检测。
Listing 27.2: Computer Class (Early Initialization) 
  1. public class Computer { 
  2.   //Constituting Object 
  3.   private CPU cpu; 
  4.   private String name; 
  5.   //Constructor 
  6.   public Computer(String n) { 
  7.     name = n; 
  8.     cpu = new CPU("Intel"); 
  9.   } 
  10.   public boolean start() { 
  11.     //… 
  12.     System.out.println("CPU activated"); 
  13.     return true
  14.   } 
  15.          … 
  16.          … 
    
    这样做不需要对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 
  1. public class Computer { 
  2.   //Constituting Object 
  3.   private final CPU cpu; 
  4.   private String name; 
  5.   //Constructor 
  6.   public Computer(String n) { 
  7.     name = n; 
  8.     cpu = new CPU("Intel"); 
  9.   } 
  10.   public boolean start() { 
  11.     //… 
  12.     System.out.println("CPU activated"); 
  13.     return true
  14.   } 
  15.   public boolean executeTask() { 
  16.     //… 
  17.     System.out.println("CPU is Executing the Task"); 
  18.     return true
  19.   } 
  20.   public boolean stop() { 
  21.     //… 
  22.     System.out.println("CPU is stopped"); 
  23.     return true
  24.   } 
  25. class CPU { 
  26.   private String name; 
  27.   public CPU(String n) { 
  28.     name = n; 
  29.   } 
  30.  


 
Figure 27.2: Revised Computer Class Representation as an Aggregate 
   因为可以确保成员变量被初始化,不同的方法可以消除对变量的初始化。
例子中的构建的聚合对象的组成对象是一个单一的、小对象。有时,聚合对象可能由很多大的、复杂的对象组成。这就会导致在创建聚合对象时,创建所有的它的组合对象的代价很大。这种情况下,根据虚拟代理模式可以对每一个组成对象设计一个相应的代理对象。

附件为原文!
附件:Chapter_27.doc(69K) 附件:31.rar(3K) 

  --相关文章--
· 面向对象编程,我的思想 (2007-04-13)
· 面向对象的思维方式 (2007-04-13)
· 通过Javanbsp;Swing看透MVC设计模式 (2007-04-13)
· 适配器模式(Adapternbsp;Pattern) (2007-04-13)
· 追MM与Java的23种设计模式 (2007-04-13)
· 责任链模式(Chainnbsp;ofnbsp;Responsibility) (2007-04-13)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接