面向对象设计原则

2 篇文章 0 订阅
1 篇文章 0 订阅

面向对象的设计原则

我们大家都是乐于分享的人

单一职责原则

最近老是发生过洪灾什么的,然后当兵的兄弟们总是去到处抢险。经常需要搬运那个沙袋去做堤挡水。然后沙袋到要安放的距离有很长一段距离。大家注意看新闻的话就会发现,解放军战士们都是从沙袋起点到终点站成一路传递沙袋到需要安放的地方的。为什么大家不每人从源点搬到终点呢?其实这个就是用到了单一职责原则(Single Pesponsibility Principle)。每个战士负责搬运中的一个传递任务。
单一职责要求:
(1)对于每一个类而言,应该只有一个引起它变化的原因。这点很好理解,当满足这个条件的时候,如果修改这个类的时候,只要考虑到这个引起它变化原因就行了。
(2)一个相同的职责不应该随处摆放多个。必须以后对这个职责做修改的时候,就要要修改多出。使类的复用性大大降低。
(3)一个类中应该只放一个职责。比如有些人把工程师、销售人员、销售经理都放在职员类的话。其中一个角色的发生了变化,就会影响到这整个类。

总的来说单一职责的含义就是:一个是避免相同的职责分散到不同的类中、另一个是避免一个类承担太多的职责。
一般来说做到SRP的方法是:
根据业务流程,用单一职责的原则把业务职责详细的一个个都提炼出来。在具体设计每个类的时候一定要定界限清除。一是要防止越俎代庖,而是防止类对功能的相互推诿。


接口隔离原则

接口隔离原则其实我觉得应该叫接口尽量细分的原则。当一个子类实现某个接口的时候,由于接口中定义了一些对于子类来说多余的方法,这个时候子类就要无奈的实现这些没用的方法才能实例化。这时这个接口我们就叫它为胖接口,肯定要拆的。

接口隔离(Interface Segregation Principle)原则:
(1)ISP可以达到不强迫客户(接口的使用方)实现他们不用的方法。也就说接口的设计应满足前面的单一职责原则。方法对于所有子类都是不冗余的。
(2)客户端程序不应该考虑(依赖)它不需要的接口方法。客户端需要什么接口,就设计什么接口。把不需要的接口都剔除掉,保证其纯洁性。

接口既要拆,但也不能拆得太细、这个就有个标准(接口设计出来,你能看出来满足一个任务的基本要求,比如你设计一个“人”的接口,至少得把人的基本成员方法设计出来啊)。这个标准也叫做高内聚。

但如果一个接口如果满足接口隔离原则。但其某种实现类(对于其所有实现类,这种实现类又是少数)都有一些特殊的功能怎么半呢?比如你设计一个“动物“的接口,但我们知道有一群动物是能思考说话的。解决办法也是利用委托分离接口。另一种就用多继承(实质是实现多个接口,因为JAVA,PHP都是单继承)


开放封闭原则

开放封闭原则(Open-Close Principle)
这条原则的基本思想是:
Open:模块的行为必须是开放的、支持扩展的,而不是僵化的
Closed:在对模块的功能进行扩展时,不应该大规模影响已有的程序块

解读:其实开放封闭原则就是让对抽象编程(抽象类、接口)。因为通过定一个接口或抽象类,当要需求发生变化时。可以提供该接口新的实现类,以求适应变化。而不会影响其他实现类。更具体的说,这里的Open 体现在,可以通过提供新的实现类来扩展模块。而这里的Closed体现在接口是所有实现类的接口是不变的。
一句话:开放封闭原则就是让大家面向接口编程,面向抽象类编程。允许添加新的功能,而不允许修改已有的功能。


替换原则

MIT计算机科学实验室的Liskov女士提出的这个原则。她当时这样说了一句话“Agile Subtypes Software Principles must be substituable for their base types ”灵活轻巧的子类软件原则必须能够满足子类始终能在语法上替换它父类的位置。
具体怎么满足替换原则(LSP):
(1)父类定义的方法,子类中必须全部实现或重写(咋一听,咋像接口隔离了呢?其实这几个原则都是互补的,互有交叉的)。而且子类尽量只实现父类或父接口的方法,不应当给出多余的方法定义或实现。
(2)在客户端程序中应该使用父类型去引用子类对象而不应当直接使用子类对象,这样可以实现运行期绑定(动态多态)。这样做至少有一个好处,就是对于某个功能,想换一种实现了,只需在实例化具体对象的地方改一下即可,不用到处改下面的代码(因为下面都是用的父类类型接受)
下面我放一点JAVA代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutputStreamDemo{
   public static void main(String[] args) throws Exception{
   File f=new File("d:"+File.separator+"test.txt");
   OutputStream out=null;
   out=new FileOutputStream(f);
   String str="Hello Dafanzi";
   byte[] b=str.getBytes();
   out.write(b);
   out.close();
   }
}
这段代码里,对于FileOutputStream这个子类我们一直用的OutputStream这个父类的类型引用。其实这就是这个替换原则所说的事儿。

依赖倒置原则

依赖倒置原则。简单地讲就是将依赖关系倒置为依赖接口。就是一个抽象类不能设计成因为子类的变化就变化。(唉,……这个听着又有点像开放封闭原则)。什么意思呢?一个项目里,父类不能依赖子类。子类应该是扩充父类而不是去引起父类的改变。
这里我借一个例子,这个例子是百度百科上关于这个原则的讲解。点这儿

其实这几个原则可以简单的归纳为:我们应让每个类做一个职责的事儿,一个职责的事儿不应该分开放。接口设计要合理,使得它子类实现接口所有方法都有意义。多使用面向抽象(接口、抽象类的使用)编程。另外为了实现运行的多态,都学会用父类型应用子类对象。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值