java设计六大原则之开闭原则(OCP)

抽象化是关键

定义抽象类或接口,使其可以有很多的具体实现(openfor extension)

预见所有的需要,在任何情况下都不再修改上层商业逻辑(closedfor modification)

对可变性的封装原则

一种可变性不应当散落在代码的很多角落里,应当将其封装在对象里面,同一种可变性的不同表象意味着同一个继承等级结构中的具体子类,继承最大的用途就是作为封装变化的方法

一种可变性不应当与另一种可变性混合在一起,如果继承结构超过了两层,这就意味着将两种不同的可变性混在一起了

抽象类

1.在Java语言里面,类有两种:具体类和抽象类

 具体类可以实例化;抽象类不可以实例化

2.抽象类仅提供一个类型的部分实现,抽象类可以有实例变量,以及一个或多个构造子,抽象类可以同时有抽象方法和具体方法。一个抽象类的构造子可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共有的实现,而不同的子类可以在此基础上有自己的实现

3.抽象类和子类的这种关系实际上就是模板方法模式

抽象类的用途:

1.抽象类通常代表一个抽象概念,它提供一个继承的出发点。而具体类则不同,具体类可以实例化,应当给出一个有商业逻辑实现的对象模板。由于抽象类不可以实例化,因此一个设计师设计一个新的抽象类,一定用来继承的。换句话说,具体类就不是用来继承的

2.ScottMeyers [Effective C++的作者]指出:只要有可能,不要从具体类继承。在一个以继承关系形成的树型结构里面,树叶节点都应该是具体类,树枝节点都应该是抽象类

抽象类的用法:

1.抽象类应当拥有尽可能多的共同代码

1.1在一个从抽象类到多个具体类的继承关系中,共同的代码应当尽量移动到抽象类中,这样可以提高代码的复用率。当需要修改这些共同的代码时,设计师只需修改一个地方

2抽象类应当拥有尽可能少的数据

2.2与代码移动的方向相反,数据的移动方向是从抽象类到具体类,一个数据对象不论是否使用都会占用资源,因此数据应当尽量放到具体类或等级结构的低端


接口

1.在家中,可以很容的将微波炉从电源插座上拔下来,然后将手提电脑插上去,那是因为对于电源来说,电器都是可插入构件,它们都具有与电源插座相匹配的插头

1.1如果可以将一个构件移走,并以另一个构件取而代之,那么这种构件就是可插入构件(PluggableComponent)

2所谓接口,实际上就相当于电源插座;而可插入构件就相当于与这种插座匹配的电器。实现可插入构件的关键在于存在一个公共的接口,每个构件都实现了这个接口

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

Java中的接口

1.Java接口是一些方法特征的集合,接口中只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被实现并且具有完全不同的行为。当然,Java还允许在接口中定义常量

2.Java接口中的方法只能是abstract和public,接口中不能有构造器,可以有public、static和final的属性

3.接口将方法的特征和方法的实现分割开来,这种分割体现在接口常常代表一种角色,它封装与该角色相关的操作和属性,而实现这个接口的类就是扮演这个角色的演员

4.一个角色可以由不同的演员来扮演,一个演员也可以扮演不同的角色(一个接口可以被多个类实现,一个类可以实现多个接口)

为什么使用接口:

1.没有接口,可插入性就没有保证

1.1关联的可插入性:如果一个关联不是针对一个具体类,而是针对一个接口的,那么任何实现了该接口的类都可以满足要求。换言之,当前对象并不在意关联的是哪一个具体类,而仅仅关心这个类是否实现了某个接口

1.2调用的可插入性:一个对象不可避免的需要调用其他对象的方法,这种调用不一定非得是某一个具体类,而可以是一个接口。这样任何实现了这个接口的具体类都可以被当前对象调用;而当前对象调用的到底是哪一个具体类的实例则完全可以动态的决定

2.软件系统的规模越大,生命周期越长,接口的重要性就越大

3.接口使得软件系统在可扩展性、灵活性和可插入性三个方面都得到了保证

--------------------- 作者:咩咩文 来源:CSDN 原文:https://blog.csdn.net/u011659172/article/details/51505640?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/wojiushiwo577785/article/details/82992657
今日推荐