知识大全 深入浅出基于Java的建造设计模式

Posted

篇首语:劳动教养了身体,学习教养了心灵。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 深入浅出基于Java的建造设计模式相关的知识,希望对你有一定的参考价值。

深入浅出基于Java的建造设计模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   一 引子  前几天陪朋友去装机店攒了一台电脑 看着装机工在那里熟练的装配着机器 不禁想起来了培训时讲到的建造模式 作为装机工 他们不用管你用的CPU是Intel还是AMD 也不管你的显卡是 千大元还是白送的 都能三下五除二的装配在一起——一台PC就诞生了!当然对于客户来说 你也不知道太多关于PC组装的细节 这和建造模式是多么的相像啊!    今天就来探讨一下建造模式     二 定义与结构  GOF给建造模式的定义为 将一个复杂对象的构建与它的表示分离 使得同样的构建过程可以创建不同的表示 可以将建造模式的精髓概括为 将构造复杂对象的过程和对象的部件解耦 这是对降低耦合 提高可复用性精神的一种贯彻 其实这种精神贯彻在GOF几乎所有的设计模式中     是不是和上面提到的装机流程相像?    这个很多人认为同抽象工厂模式相似的建造模式用在什么样的设计环境下呢(对于两者的比较稍候讨论)?我认为可以总结为以下环境 当要生成的产品有复杂的内部结构 其中的内部结构由多个对象组成 系统将来可能要改变产品对象的内部结构的构成或者实现方式 比如说产品的一些属性现在是从数据库中得到的 而将来可能从XML中解析得到 而且不能将产品的内部构造完全暴露给客户程序 一是为了可用性 二是为了安全等因素 满足上面的设计环境就可以考虑使用建造模式来搭建框架了 来看看建造模式的组成吧     抽象建造者角色 这个角色用来规范产品对象的各个组成成分的建造 一般而言 此角色独立于应用程序的商业逻辑     具体建造者角色 担任这个角色的是于应用程序紧密相关的类 它们在指导者的调用下创建产品实例 这个角色在实现抽象建造者角色提供的方法的前提下 达到完成产品组装 提供成品的功能     指导者角色 调用具体建造者角色以创建产品对象 指导者并没有产品类的具体知识 真正拥有产品类的具体知识的是具体建造者对象 产品角色 建造中的复杂对象 它要包含那些定义组件的类 包括将这些组件装配成产品的接口     来看下这些角色组成的类图     首先客户程序创建一个指导者对象 一个建造者角色 并将建造者角色传入指导者对象进行配置 然后 指导者按照步骤调用建造者的方法创建产品 最后客户程序从建造者或者指导者那里得到产品     从建造模式的工作流程来看 建造模式将产品的组装 外部化 到了建造者角色中来 这是和任何正规的工厂模式不一样的——产品的创建是在产品类中完成的      三 实现  实在找不到太好的例子 我认为《java与模式》中发邮件的例子还算可以 这里我将《Think in Patterns with Java》中的例子放到这里权且充个门面 媒体可以存在不同的表达形式 比如书籍 杂志和网络 这个例子表示不同形式的媒体构造的步骤是相似的 所以可以被提取到指导者角色中去     import java util *;  import junit framework *;    //不同的媒体形式:    class Media extends ArrayList   class Book extends Media   class Magazine extends Media   class WebSite extends Media     // 进而不含不同的媒体组成元素:    class MediaItem   private String s;  public MediaItem(String s) this s = s;   public String toString() return s;       class Chapter extends MediaItem   public Chapter(String s) super(s);       class Article extends MediaItem   public Article(String s) super(s);       class WebItem extends MediaItem   public WebItem(String s) super(s);       // 抽象建造者角色 它规范了所有媒体建造的步骤:    class MediaBuilder   public void buildBase()   public void addMediaItem(MediaItem item)   public Media getFinishedMedia() return null;       //具体建造者角色    class BookBuilder extends MediaBuilder   private Book b;  public void buildBase()   System out println( Building book framework );  b = new Book();      public void addMediaItem(MediaItem chapter)   System out println( Adding chapter + chapter);  b add(chapter);    public Media getFinishedMedia() return b;       class MagazineBuilder extends MediaBuilder   private Magazine m;  public void buildBase()   System out println( Building magazine framework );  m = new Magazine();      public void addMediaItem(MediaItem article)   System out println( Adding article + article);  m add(article);    public Media getFinishedMedia() return m;       class WebSiteBuilder extends MediaBuilder   private WebSite w;  public void buildBase()   System out println( Building web site framework );  w = new WebSite();      public void addMediaItem(MediaItem webItem)   System out println( Adding web item + webItem);  w add(webItem);      public Media getFinishedMedia() return w;       //指导者角色 也叫上下文  class MediaDirector   private MediaBuilder mb;  public MediaDirector(MediaBuilder mb)   this mb = mb; //具有策略模式相似特征的      public Media produceMedia(List input)   mb buildBase();  for(Iterator it = erator(); it hasNext();)  mb addMediaItem((MediaItem)it next());  return mb getFinishedMedia();    ;    //测试程序——客户程序角色    public class BuildMedia extends TestCase   private List input = Arrays asList(new MediaItem[]   new MediaItem( item ) new MediaItem( item )   new MediaItem( item ) new MediaItem( item )   );    public void testBook()   MediaDirector buildBook = new MediaDirector(new BookBuilder());  Media book = buildBook produceMedia(input);  String result = book: + book;  System out println(result);  assertEquals(result book: [item item item item ] );      public void testMagazine()   MediaDirector buildMagazine = new MediaDirector(new MagazineBuilder());  Media magazine = buildMagazine produceMedia(input);  String result = magazine: + magazine;  System out println(result);  assertEquals(result magazine: [item item item item ] );      public void testWebSite()  MediaDirector buildWebSite = new MediaDirector(new WebSiteBuilder());  Media webSite = buildWebSite produceMedia(input);  String result = web site: + webSite;  System out println(result);  assertEquals(result web site: [item item item item ] );      public static void main(String[] args)   junit textui TestRunner run(BuildMedia class);          在实现的时候 抽象建造角色提供的接口必须足够普遍 以适应不同的具体建造角色 对于一个建造角色来说可能某个步骤是不需要的 可以将此接口实现为空 多个产品之间可能没有太多的共同点 可以提供一个标示接口作为抽象产品角色 也可以不提供抽象产品角色 这时要将提供产品的接口从抽象建造角色里面去掉 不然就会编译出问题      四 应用优点  建造模式可以使得产品内部的表象独立变化 在原来的工厂方法模式中 产品内部的表象是由产品自身来决定的 而在建造模式中则是 外部化 为由建造者来负责 这样定义一个新的具体建造者角色就可以改变产品的内部表象 符合 开闭原则     建造模式使得客户不需要知道太多产品内部的细节 它将复杂对象的组建和表示方式封装在一个具体的建造角色中 而且由指导者来协调建造者角色来得到具体的产品实例     每一个具体建造者角色是毫无关系的     建造模式可以对复杂产品的创建进行更加精细的控制 产品的组成是由指导者角色调用具体建造者角色来逐步完成的 所以比起其它创建型模式能更好的反映产品的构造过程      五 扩展  建造模式中很可能要用到组成成品的各种组件类 对于这些类的创建可以考虑使用工厂方法或者原型模式来实现 在必要的时候也可以加上单例模式来控制类实例的产生 但是要坚持一个大前提就是要使引入的模式给你的系统带来好处 而不是臃肿的结构 建造模式在得到复杂产品的时候可能要引用多个不同的组件 在这一点上来看 建造模式和抽象工厂模式是相似 cha138/Article/program/Java/gj/201311/27421

相关参考

知识大全 在 Java 程序设计中处理 DOM 异常

在Java程序设计中处理DOM异常  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在使用基于Ja

知识大全 您的 利用 Java 平台的特性建造一个令人瞩目的系统

您的利用Java平台的特性建造一个令人瞩目的系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 想学习下手机软体开发 是基于安卓系统的 应该怎样做

想学习下手机软体开发是基于安卓系统的应该怎样做要学好多~学C++,JAVA,及安卓基础~等想找安卓手机软体开发工作应该学什么这个你就去学程式设计和Java,软体开发你可以在应用宝上面下载这个软体开的教

知识大全 Java技术进阶 基于Java的IDEA加密算法探讨

Java技术进阶基于Java的IDEA加密算法探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 基于服务器的Java安全产品

基于服务器的Java安全产品  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果您认为Java的

知识大全 基于角色模型的Java开发

基于角色模型的Java开发  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于软件开发人员而言调

知识大全 Java Mail 深入浅出(2)

JavaMail深入浅出(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /**  *Sen

知识大全 Java Mail 深入浅出(1)

JavaMail深入浅出(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我干软件开发也有一

知识大全 基于Java 2运行时安全模型的线程协作

基于Java2运行时安全模型的线程协作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Java

知识大全 基于SMTP的JAVA邮件发送程序

基于SMTP的JAVA邮件发送程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这个程序没有使