posts - 2, comments - 2, trackbacks - 0, articles - 23
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

《java与模式》(阎宏) 学习笔记I

Posted on 2008-12-16 10:09 齐纳尔多 阅读(329) 评论(0)  编辑  收藏 所属分类: 设计模式

一、uml的学习,了解
1.类图(主要)

2.时序图(箭头、生命线--垂直的虚线、激活条)
3.状态图

二、设计原则
1.软件系统的核心的软件的可维护性(maintainability)和可重用性(Reusability)
        I、软件维护性低的4点原因(过于僵硬Rigidity、过于脆弱Flagility、复用性低Immobility、黏度过高viscosity)
        II、设计目标3条:(可扩展性Extensibility、灵活性Flexibility、可插入性Pluggability)
        III、面向对象的复用:复用焦点的倒转说的是复用不再集中到函数和算法的具体实现上,而是集中到最重要的业务逻辑上去。
2.设计原则
        I、开闭原则(Open-Closed-Principle)    ----> OOD 的根本
            定义: 就是软件实体应该对扩展开放,对修改关闭。
            如何实现:关键在于抽象化(就是说给系统定义出一个不再更改的抽象设计,此设计允许有无穷无尽的的行为在实现层被实现)
            对可变性的封装原则(Principle of Encapsulation of Variation EVP 这是OCP的另一个角度的说法)  :定义是找到一个可变的因素,将其封装起来。
            一种重构做法的讨论:
                    "将条件转移语句改写为多态性" 是广为流传的代码重构的做法,要注意使用的场合(从OCP出发)     
            java.util.Calendar 不符合开闭原则, 
        II、接口和抽象类
            1.抽象类是用来继承的,具体类不是用来继承的(认真体会)
            2.抽象类应该拥有尽可能多的代码,尽可能少的数据
            3.不要滥用继承,哪何时使用继承呢?
                    满足4条可使用继承(
                        a.子为父的特殊种类,而不是一个角色 是is-a关系,而不是(has-a关系-->聚合Aggregation)
                        b.永远不会出现需要将一个子类转换成另一个子类的情况
                        c.子类具有扩展超类的责任,而不是置换掉(override)或者 注销掉(Nullify) 的责任
                        d.只有在分类学有意义时,才可以使用继承,不要从工具类继承
                    )
        III、里氏代换原则(Liskov Substitution Principle LSP)----> 是继承复用的根本
                1.定义:一个软件实体如果使用的一个超类的话,那么一定适用于子类,而且根本察觉不到超类对象和子类对象的区别。
                                (换言之---> 父类使用的地方,一定可以替换成子类)
                2.Java语言可以在编译期间可以从无关业务逻辑、语法上检查一个程序是否符合LSP(比如说:子类中override父类的一个方法时其访问权限不能更小)
                3.LSP说的是超类和子类之间的关系。
        IV、依赖倒转原则(Dependency  Inversion Principle)
                1.定义: 要依赖于抽象,不要依赖于具体
                2.依赖(耦合)关系
                    a.零耦合(Nil Coupling)两个类没有耦合关系
                    b.具体耦合(Concrete Coupling)两个具体类之间,一个类对另一个类直接调用造成
                    c.抽象耦合(Abstract Coupling) 一个抽象类和一个具体类之间
                3.具体说明:
                    a.DIP 要求客户端依赖于抽象耦合
                    b.表述一: 抽象不应该依赖于细节,细节应该依赖于抽象(Abstractions should not depend upon details,Details should depend upon abstractions)
                    c.表述二:要针对于接口编程,不要针对于实现编程(Program to an interface not  an implementation)
                            具体来说:针对于接口编程,就是使用Java接口和抽象Java类进行 变量的类型声明、参数的类型声明、方法返回值的类型声明、数据类型的转换
                             反之,就是不使用  如何做到呢??一个具体的Java类应该只实现Java接口和抽象Java类中声明过的方法,而不应该写其他多余的方法
                4.变量的静态类型和变量的实际类型
                    a.静态类型(Static Type): 变量被声明时的类型,又称明显类型(Apparent Type)
                    b.实际类型(Actual Type):  变量所引用对象的真实类型
                    比如: List employees = new Vector();        //List为静态类型,Vector为实际类型
                    c.作用: 要引用对象的抽象类型--> 如果一个对象有一个抽象类型的话,应该使用此抽象类型作为对象的静态类型.
                            List employees = new Vector();        // 代替 Vector employees = new Vector();       
                            List employees = new ArrayList();    //面向抽象编程        这里有一定的问题,其构造还是具体类的构造,需要通过模式改进。
               5.如何做到依赖倒转?
                    a.关键点:以抽象方式耦合
               6.Java对抽象类型的支持
                    a.提供了两种支持:接口和抽象类
                    b.接口和抽象类区别
                        1.抽象类可以提供部分方法的实现,而接口不可以
                        2.子类只能继承1个抽象类,而接口的实现类却可以实现多个接口
                        3.从代码重构的角度看,将一个具体类重构成一个接口的实现很容易,而抽象类却比较复杂
                        4.Java接口是定义混合类型(Mixin Type) 的理想工具  
                                比如Hashtable 其主类型是Map 次类型为Clonable Serializable
                7.联合使用Java接口和Java抽象类
                    具体说明:声明一个接口,给出一个抽象类实现此接口,在抽象类中具体实现此接口中的方法,可以程序就可以选择实现接口或者继承此抽象类
                     称为“缺省适配模式(Default Adapter)”
                    参看Java API (abstract + 接口名) 就使用这样的 Default Adapter 比如Collection --> AbstractCollection
                8.优缺点:
                    a.强大,但不容易实现(需要很好的oop思想)
                    b.DIP:假定所有的具体类都是变化的,这不太准确,有些具体类是相对稳定的,就不需要再使用抽象了~·
           V、接口隔离原则(Interface Segeration Principle ISP)
                1.定义: 使用多个专门的接口比使用单一的总接口要好~,但不要提供不必要的接口,否则可能造成接口污染(interface Contamination)
                2.“接口”的理解: 
                        a.一个类中所有方法的集合(角色隔离原则)
                        b.真正意义上的接口(interface)(定制服务原则:Customized Service)
          VI、组合/聚合复用原则(Composition/Aggregation Reuse Principle  CARP)
                1.定义:在一个新的对象里面使用一些已有的对象,使之称为新对象的一部分,新的对象通过向这些对象委派达到复用已有功能的目的
                               简言之:尽量使用聚合组合,不要使用继承
                2.复用
                    a.组合/聚合
                    b.继承
         VII、迪米特法则(Law of Demeter  LOD)--> Least Knowledge Principle 最少知识原则
                1.定义:一个对象应该对另一个对象有尽可能少的了解
                2.如果两个类不必彼此通信,那么这两个类也不必发生相互作用,如果其中一个类需要调用另一个类的方法,可以通过第三者转发这种调用.   
                3.使用说明:
                    a.优先考虑将一个类设置为不变类
                    b.尽量降低一个类的访问权限
                    c.慎用Serializable 
                    d.尽量降低成员的访问权限
                             


只有注册用户登录后才能发表评论。


网站导航: