CppExplore

一切像雾像雨又像风

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  29 随笔 :: 0 文章 :: 280 评论 :: 0 Trackbacks
作者:CppExplore 网址:http://www.cppblog.com/CppExplore/
好久不更新了,拿以前的文章凑凑数,从java那边转一篇过来。

最近发现一本<java与模式>,正好再温故一下当年的专业课内容,下面是这几天记的笔记.(并不是系统的讲解书中的内容)
一  综述:
1、不要使用接口定义常量
2、自己少用标志接口
3、不要继承具体类
4、类层次的中间节点应该是接口或者抽象类,叶子是具体类
5、子类应当扩展父类的责任,而不是覆写父类的责任
6、面向接口编程
7、不要滥用继承,组合优先于继承

java中设计不当的类:calendar:作为接口,含有与具体的历法(罗马历法)相关的常量,不能扩展到中国的阴历历法(不符合开闭原则)
                    properies类:滥用继承,继承至hashtable,应当使用聚合

8、笛比特法则:只与自己的直接朋友通信,不与陌生人通信(1)狭义笛比特法则:只与朋友通讯,通过自己的朋友传递间接的调用(2)结合依赖倒转原则修改:不必通过朋友传递间接的调用,通过陌生人的抽象接口调用陌生人的行为(依旧不能与具体的陌生人发生通信)
9、尽量降低类中成员的访问权限,不要设计退化类(类似c中struct)。
        java中的point2D以及Dinmension2D类有这种设计缺陷(不过这种情况问题不大)
10、如果多个具体的产品类没有共同的商业逻辑,就可以把它们抽象到一个接口中,如果有共同的商业逻辑,就把共同的部分抽象到抽象类中,共同的部分尽量向类继承层次的上层移动,以达到复用的目的
二   工厂模式
1、简单工厂模式:参与角色:工厂/抽象产品类/具体产品类

   缺点:添加新产品的时候,虽然产品相关代码符合开闭原则,但对工厂类本身并不符合,需要修改其中的产生产品方法或者添加新的产生方法(工厂里实现的不同造成的修改不同)来支持新的产品类
   退化方式:省略掉工厂角色,抽象产品类担任具体产品类的工厂角色:提供静态的getInstance方法,比如java类库中的DateFormat类,(本人认为这样很不符合开闭原则,父类中出现与具体子类相关的代码,不方便扩展,添加新产品的时候,修改的时候缺点与原简单工厂的工厂角色类似)

2、工厂方法模式:参与角色:抽象工厂类/具体工厂类/抽象产品类/具体产品类
     消除了简单工厂的缺点
3、抽象工厂模式:简单工厂模式与工厂方法模式的结合

4、单例模式:饿汉和懒汉两种,前者将本身对象作为静态私有属性事先生成,后者推迟到调用的时候,后者需要考虑多线程的时候,前面需要加线程安全关键字(注意),java中还是前者为优。
   不要滥用单例,只有系统要求只有一个类的实例的时候才调用
   有的单例可能有状态属性,这就为多例模式提供了可能
   含有私有属性的类作成单例的时候尤其要注意:一是私有属性的线程安全,确实需要的时候可以加线程安全关键字,比如系统中的log类,二是确认这些属性是不是可以所有线程共享的,类似普通类的static
三   各种具体模式(1)
1、建造模式:参与角色4个:指导者、抽象建造对象、具体建造对象、产品
      一个复杂的产品有很多的零部件,就可以使用具体的建造对象来一一构造
2、原始模式:深拷贝、浅拷贝
3、适配器模式:将adaptee类适配成目标接口
4、合成模式:参与角色:composite接口、树枝节点类、树叶节点类
      分成透明式和安全式两种,各有优缺点
      (1)前者将管理子对象的方法放到接口中,这样树型结构中的所有对象都是透明的,都可以统一调用,但是叶节点并没有管理子对象的能力,因此透明但不安全
      (2)后者将管理子对象的方法下放到树枝节点类中,这样安全但不透明
5、装饰模式:继承已有类的接口,提供和已有类相同的方法,并对已有类的功能提供扩展(通过组合已有对象,调用已有对象方法的时候加入新的代码)
      (1)透明的装饰模式(纯粹的装饰模式):装饰类、被装饰类继承于同一接口,而且装饰类只实现接口的方法,不提供额外方法的实现,调用该类的时候使用接口声明调用(实例化当然还是自己的构造函数),即该类的所有方法都是透明的
      (2)半透明的装饰模式(退化的装饰模式):装饰类、被装饰类继承于同一接口,装饰类不仅实现接口的方法,还提供额外方法的实现,这样要调用它独特的方法的时候就必须使用它本身来调用,退化到一半装饰模式、一半适配器模式。
四   各种具体模式(2)

1、代理模式:参与角色:代理与真实实体共同的抽象角色、代理角色、真实实体角色
       远程代理:封装对与远程对象复杂的调用通讯过程,象调用本地对象一样
       虚拟代理:真实实体加载时间过长的,使用虚拟代理提供友好的显示方式,一边加载实际的对象
       安全代理:调用真实的对象之前插入权限验证模块
       智能引用代理:调用真实的对象之后调用统计等相关操作模块

2、享元模式:参与对象:建造工厂、抽象享元、具体享元
       分析对象的内蕴与外蕴状态,即不变的私有属性与变化的私有属性。建造工厂使用备忘录模式存储已经建造的对象,建造对象的时候,以参数的形式传递享元对象的内蕴属性。实际调用中,使用传递外部参数的方法使用外蕴变量。

   复合的享元对象组成的对象,不可以整体使用享元模式,但可以单个的享元对象属性使用该模式
   优点:降低内存中的对象  缺点:设计复杂性 

3、门面模式:结构模式。为包含有很多对象的子系统提供统一的操作接口类,所有对该子系统的调用都通过这个类,降低子系统之间调用的复杂度,也符合笛比特法则(一个对象的朋友尽量少,只与朋友说话)

4、桥梁模式:参与角色:抽象化角色、抽象化的具体角色、实现化角色、实现化的具体角色两个有继承等级的对象群,一个对象群对另一个对象群有调用关系的时候使用
        目的:使抽象化与实现化解藕
五   各种具体模式(3)
1、策略:常用于算法族,将算法从依赖的环境中抽象出来形成
2、状态:和策略非常接近,使用于有明显状态变化的时候
3、命令:命令的发起与执行解藕,命令类可以独立演化,有助于做redo undo操作以及记录所执行的命令
4、解释:用于文法的解析
5、迭代子:java中有现成的实现,iterator
6、观察者:常见,类似与模型视图的关系,java中提供了oberver类和observable接口
7、调停者:处理混乱的类交互,抽象出中间类,将类间的交互都通过这个类完成
8、模版:将拥有同一父类的多个具体子类的共同操作提取出来形成抽象模版类
         原则:具体的私有属性应该放到具体类中,抽象类中调用属性通过属性方法而不是直接调用属性
               将私有属性放到具体的类中,才能方便对父类进行多个实现。
         将行为看作划分类的标准,以前我都是将数据模型看作划分类的思想,以后应该重新审视行为在类中的重要作用,特别是在的继承等级中。

posted on 2009-05-13 22:18 cppexplore 阅读(2400) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理