HEAD IN DESIGN PATTERNS第一章读书笔记

上一篇 / 下一篇  2007-06-22 16:54:42

    学习了《深入浅出DESIGN PATTERNS》的第一章,关于设计模式方面暂时不表,感觉还没有完全参透,单表一表这章的例子程序。这篇笔记主要是针对C++和JAVA的编程比较的。

    JAVA和C++都学过,但是都是简单的学习,并且长时间没有接触了,很多概念都模糊了,并且两种语言很容易混淆。如果习惯了其中一种的语法,转到另一种时总有种似是而非的感觉。

    这章的例子程序是一个MiniDuckSimulator的程序,书中是用JAVA实现的(DESIGN PATTERN里面的原理似乎通常都是用JAVA,我的理解是因为和C++比较起来JAVA的面向对象更纯粹)。首先是一个absract class Duck,它包含一个抽象方法diaplay(),以及两个interface类型的成员变量flybehavīor和quackbehavīor,使用这两个interface的原因是:并不是所有的Duck都能fly或者quack,所以必须把这两种方法从Duck类中分离出来;但是由于JAVA不支持多重继承,因此这两个抽象行为就抽象成了两个interface,每一种具体的fly行为和quack行为都实现为一个具体的类,并且实现上述接口。具体的Duck如MallardDuck继承了Duck类,并且把flybehavīor和quackbehavīor这两个接口类变量具体化为Quack类和FlyWithWings类。这样Duck类通过performFly()方法和performQuack()方法把fly行为和quack行为delegate给了flybehavīor和quackbehavīor,最终由实际的Flybehavīor和Quackbehavīor类成员变量完成这两个方法。

    程序很简单,但是把它转化为C++时还是遇到了一些问题。

    首先是Duck类中的flybehavīor和quackbehavīor这两个成员变量,在JAVA中通过接口类执行fly()方法和quack()方法,都是运行时按照对象的实际类型执行对应的方法;而在C++中,只有通过基类指针或引用间接指向派生类子类型时,多态性才会发生作用。并且在C++中,构造函数返回的是一个指针,因此flybehavīor和quackbehavīor这两个成员变量应修改为指针类型的p_flybehavīor和p_quackbehavīor。

    其次是Flybehavīor类中的fly()方法和Quackbehavīor类中的quack()方法,在JAVA实现中它们是interface中的方法,默认为abstract的,要达到相同的语义,在C++中就要用纯虚函数来实现。这样Flybehavīor类和Quackbehavīor类也就成为抽象基类;另外在JAVA实现中,Duck类的diaplay()方法是一个抽象方法,在C++中用纯虚函数实现,因此Duck类也是一个抽象基类。(这样可以看到JAVA里的abstract class和interface在JAVA中的相同语义实现都是抽象基类)。

    此外,在JAVA类中没有显式声明访问控制符的成员变量默认是友元型的,即同一个包中的类和自身可以访问,如果子类不与该基类在同一个包内,则也不能访问这些成员变量。在这个例子中,因为Duck类和MallardDuck类在同一个包下,因此MallardDuck可以访问成员变量flybehavīor和quackbehavīor;而在C++中没有显式声明访问控制符的成员变量默认是private的,因此需要把p_flybehavīor和p_quackbehavīor显式的声明为protected。

    无论是JAVA的abstrace class中的abstract 方法还是C++抽象基类中的纯虚函数,在具体的子类(非抽象类)中都必须实现。此外还需要注意C++中为了避免重复包含,头文件中应使用宏定义等。

    限于本人水平,上面的内容还请指正。

 


TAG: DESIGN PATTERN

 

评分:0

我来说两句

Open Toolbar