Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

java类库中的设计模式(1)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  Java中的设计模式(一)设计模式简介

  如果要问起近10年来在计算机软件工程领域所取得的重大成就,那么就不能不提到设计模式(Design Pattern)了。 什么是模式呢?

  1.1 基本概念(3月12日)

  如果要问起近10年来在计算机软件工程领域所取得的重大成就,那么就不能不提到设计模式(Design Pattern)了。 什么是模式呢?

  什么是模式(Pattern)呢?并没有一个很严格的定义。一般说来,模式意指一种从一个一再出现的问题背景中抽象出来的问题的固定的解决方案,而这个问题背景不应该是绝对的,或者说是不固定的。很多时候看来不相关的问题,会有相同的问题背景,从而需要应用相同的模式来解决。

  说起来有些奇怪,模式的概念最开始的时候是出现在城市建筑领域的。lexander的一本关于建筑的书中明确的给出了模式的概念,用来解决在建筑中的一些问题。后来,这个概念逐渐的被计算机科学所采纳,并在一本广为接受的经典书籍的推动下而流行起来的。这本书就是: Design Patterns: Elements of Reusable Object-Oriented Software(设计模式:可复用面向对象软件元素),是由四位软件大师合写的(很多有时候我们直接用GoF来意指这四位作者,Gof的意思是Gangs of Four,四人帮)。

  设计模式指的是在软件的建模和设计的过程中运用到的模式。设计模式中很多种方法其实很早就出现了,并且应用的也比较多。但是直到GoF的书出来之前,并没有一种统一的认识。或者说,那时候并没有对模式形成一个概念。这些方法还仅仅是处在经验阶段,并没有能够被系统的整理,形成一种理论。

  每一个设计模式都系统的命名,解释和评价了面向对象系统中的一个重要的和重复出现的设计。这样,我们只要搞清楚这些设计模式,就可以完全或者说很大程度上吸收了那些蕴含在模式中的宝贵的经验,对面向对象的系统能够有更为完善的了解。更为重要的是,这些模式都可以直接用来指导面向对象系统中至关重要的对象建模问题。如果有相同的问题背景,那么很简单,直接套用这些模式就可以了。这可以省去你很多的工作。

  在设计模式一书中涉及到23个模式,被分类为创建型模式,结构型模式和行为模式,分别从对象的创建,对象和对象间的结构组合以及对象交互这三个方面为面向对象系统建模方法给予了解析和指导,几乎可以说的上包罗万有了。但是这本书另外的一个更为重要的作用,应该是开创了在软件工程领域的模式化进程。而后,有很多模式陆续出现,比如分析模式,体系结构模式等等。

  到现在,很难想象在一个面向对象的软件开发过程中,没有利用任何的模式而从头设计的。特别是向JDK这样庞大的类库,到处都可以看到设计模式的踪影,这篇文章,主要就是探讨模式在Java类库中的应用。希望大家看了之后,能够对设计模式有一个概念上的理解,并且能够对Java中的一些类和它们的交互有更深的体会。当然,进一步对设计模式的学习,还是需要仔细的研究那本经典:GoF的设计模式。说是研究,绝对没有夸张的,这本书并不是很好懂得,没有三五遍解决不了问题哦。

  1.2 一个简单的例子

  我们先来看一看一个设计模式的简单的例子:工厂方法模式(Factory thod)。

  这是一个使用的十分广泛的模式,到处都可以看到他的应用。工厂方法模式属于构造型模式,用来完成对象的创建。它提供了一种方法,能够让程序不依赖于具体的创建的对象。

  举个简单的例子:我需要一只笔,可以用来画画。因而,我定义了一个Pen类,它拥有drawLine()方法来画直线,拥有drawCircle()方法来画圆。而事实上,世界上并没有一只纯粹的笔,有的只是毛笔,铅笔等等。当然,所有的笔都是可以用来画线和画圆的。这儿定义的Pen类只是一个抽象的超类,没有任何实现,具体的方法实现被延迟到子类Pencil,Brush来实现。

  这在编程上就会引发一些问题,同样是笔,用毛笔和用铅笔在程序上没有任何的不同,都只需要调用drawCircle()或者drawLine()方法即可。但是类的创建却是不一样的,两条语句不同,并在编译时对不同的对象进行了静态的绑定,就是这么一点点的区别,造成了程序的不可重用性。

  在这种情况下,设计模式的解决方法是引入了一个工厂类,由工厂来完成对象的创建工作,具体对象的创建,取决于传递给工厂方法的参数。我们可以看看这个模式的类图,以了解各个对象间的关系:

  通过向PenFactory的方法createPen()传递不同的参数,就可以得到不同的子类的引用,例如:


Pen aPen=aPenFactory.createPen(pencil);

  或者


Pen aPen=aPenFactory.createPen(brush);

  然后,在后面的程序中,所有对aPen的操作都是完全一样的了。程序可以毫不加以修改的运行在为Pencil类或者Brush类编写特定的实现中。

  实际上,这儿又一个很重要的概念需要加以说明一下。在设计模式中,有一个可以说是统领全篇的设计原则,就是:针对接口编程,而不是针对实现编程。这儿的Pen类也就只是一个接口,程序是按照Pen所定义的接口来编程的,如果你注意了上面的语句,你会发现,工厂方法返回的是一个Pen类,而不是具体的子类的引用,尽管它实际上返回的是一个子类的对象。不将变量申明为某个特定的具体类的实例对象,而是让它遵从抽象类所定义的接口,这更有利于程序的重用性!所有创建型的模式提供了不同的方法,来实现接口(或者说抽象类)和具体类之间的透明连接,确保了你的程序是正对接口编写的,而不是针对实现编写的。




 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:JAVA系列讲座5(基础篇之JAVA注释文档)   下一篇:java类库中的设计模式(2)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号