《Java与模式》笔记

《Java与模式》笔记

第四章                “开-闭”原则(OCP)

        OCP:Open-ClosedPrinciple,说一个软件实体应该对扩展开放,对修改关闭,最早由BertrandMeyer提出,原文:Softwareentities should be open for extension, but closed for modification. OCP被认为是面向对象的可复用设计的第一块基石。

        软件系统面临新的需求时,系统的设计必须是稳定的,应该具有两个特性:

        Ø 通过扩展已有的软件系统,可以提供新的行为功能,满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。

        Ø 已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。

 

抽象化很关键

        Java中,可以给出一个或多个抽象Java类或Java接口,规定出所有的具体类必须提供的方法的特征作为系统的抽象层。这个抽象层预见了所有的可能扩展,因此在任何情况下都不会改变。这就使的系统抽象层不需要修改。

对可变性的封装

        找出系统的可变因素,将其封装起来。

        Ø 一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。继承真正的意义是封装可变因素,而不该被认为是从一般对象生成特殊对象的方法。

        Ø 一种可变性不应当和另一种可变性混合在一起。类图的继承结构一般不超过两层,否则就存在不同可变性混合。

        很多情况下,无法百分百做到“开闭原则”,但应当努力按此原则设计,可以显著改善一个系统的结构。

 

促成开闭原则OCP

        一、里氏代换原则:任何基类出现的地方可以用子类代替

        二、依赖倒转原则:依赖与抽象,不依赖与实现

        三、合成/聚合复用原则:尽量使用合成/聚合来达成复用的目的,而不是继承关系

        四、迪米特法则:一个软件实体应当尽可能少的和其他实体发生相互作用

        五、接口隔离原则:应当给客户端提供尽可能小的接口,而不是提供大的总接口

其他设计模式促成OCP

        Ø 简单工厂

        Ø 工厂方法

        Ø 抽象工厂

        Ø 构造模式

        Ø 桥梁模式

        Ø 门面模式

        Ø 调停者模式

        Ø 访问者模式

        Ø 迭代子模式

 

Java接口

        接口是实现组件的可插入性(Pluggability)的关键。

        Java接口比抽象类更抽象,接口的方法必须是抽象的和公开的,不能有构造子。Java接口可以有public、静态的和final的属性。

        没有接口无法彻底的实现可插入性。使用抽象类可以实现一定程度的可插入性,但是Java中的类继承只能是单继承。在一个“超类—子类”的两层结构中,如果要让子类继承更多的超类特性,要么修改超类代码,但是这明显不明智。那么就只好在超类上面再次添加超类,形成3层结构,但是如果超类上面的位置已经存在超类了,那只有往上层挪,最糟糕的情况要挪到最顶端,那就相当于是整个等级结构的修改了。而如果在某一层,超类是有其他提供商提供的,就无法修改了,或者某个新的超类要挪到java.lang.Object顶上,怎么可能?

        所以,只有接口才可以实现真正的可插入性,因为接口支持多实现。

        调用和关联的可插入性:一个对象要完成某个任务,有时需要借助于其他对象,调用其方法,这种对象这件的关系就是关联。如果对象只是关心另一个对象是否实现了某接口,那么这就可以实现关联的可插入性。

        尽可能的用接口或抽象类进行变量的声明,参量的类型声明,方法返回值类型声明,而不是使用具体类。而且尽可能的使用接口,而不是抽象类。理想情况下,具体Java类只实现Java接口和抽象Java中声明的方法,而不应当给出多余的方法。

抽象类

        抽象类基于模板的设计思想。抽象类是某个类型的部分实现,可以有实例变量,一个或多个构造子,可以同时存在抽象方法和具体方法。

        抽象类不能实例化对象,具体子类必须具体实现所有的抽象父类的抽象方法,否则子类也抽象。

        设计抽象类的目的一定是用来被继承的,而具体类不是用来继承的。如果两个具体类之间需要有 继承关系,可以重构为:两个具体类为兄弟,继承同一抽象类。这将符合里氏代换。

        为了最大限度的复用,应当尽可能多的从子类中提取共同点,放到抽象父类中。

        具体数据应当尽量放到具体类中,而不应放到顶端的抽象父类中。

        面向接口,面向抽象编程。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值