面向对象设计的原则------单一职责原则

      学习设计模式,自然会涉及面向对象的设计原则,面向对象的设计原则一般包括五个原则,下面详细介绍下五个原则:

1、单一职责原则(single responsibility principle )

      There should never be more than one reason for a class to change.

      所谓单一职责原则,就是对一个类而言,应该仅有一个引起它变化的原因。换句话说,一个类的功能要单一,只做与它相关的事情。在类的设计过程中要按职责进行设计,彼此保持正交,互不干涉。

什么是职责?

      在SRP 中,职责定义为“变化的原因”。如果你能够想到多于一个的动机去改变一个类,那么该类就具有多于一个的职责。

为什么要采用单一职责原则?

      因为每一个职责都是变化的一个轴线,当需求变化时,该变化会反映为类的职责的变化。如果一个类承担了多于一个的职责,那么就意味着引起它的变化的原因会有多个。如果一个类承担的职责过多,那么就等同于把这些职责耦合在了一起。一个职责的变化可能会抑制到该类完成其他职责的能力,这样的耦合会导致脆弱的设计。当变化发生时,设计会受到意想不到的破坏。单一职责原则正是实现高内聚低耦合需要遵守的一个原则。

       注意: 单一职责原则简单而直观,但在实际应用中很难实现。只有变化的轴线仅当实际发生时才具有真正的意义。如果没有预兆,那么去应用SRP或者其他任何的原则都是不明智的。

下面就Modem接口为例,说明其原则。

interface Modem {
    public void dial(String pno);   //拨号
    public void hangup();    //挂断
    public void send(char c);   //发送数据
    public char recv();   //接收数据
}

      大多数会认为看起来非常合理,该接口声明的4个函数确实是调制解调器的功能。 然而,该接口中却显示出两个职责。第一个职责连接管理,第二个职责是数据通信。dial和hangup函数进行调制解调器的连接管理,而send和recv负责进行数据通信。这两个职责应该被分开吗?这依赖于应用程序变化的方式。如果应用程序的变化会影响到连接函数的签名,那么这个设计就是僵硬的设计,因为调用send和 recv的类必须重新编译、部署的次数会超过我们预想的情况。在这种情况下,这两个职责必须被分离,我们分别实现这两个职责于:

interface DataChannel
{
    public void send(char c);
    public void recv();
}

interface Connection
{
    public void dial(string pno);
    public void hangup();
}
下面的类图将它的2个不同职责分成2个不同的接口,这样至少可以让客户端应用程序使用具有单一职责的接口:

让ModemImplementation 实现这两个接口。我们注意到,ModemImplementation又组合了2个职责,这不是我们希望的,但有时这又是必须的。通常由于某些原因,迫使我们不得不绑定多个职责到一个类中,但我们至少可以通过接口的分割来分离应用程序关心的概念。事实上,这个例子一个更好的设计应该是这样的,如图:

小结
Single Responsibility Principle (SRP)从职责(改变理由)的侧面上为我们对类(接口)的抽象的颗粒度建立了判断基准,在为系统设计类(接口)的时候应该保证它们的单一职责性。

高内聚、低耦合解释:

      这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低
      首先要知道一个软件是由多个子程序组装而成, 而一个程序由多个模块(方法)构成!

“高内聚,低耦合”主要是阐述的面向对象系统中,各个类需要职责分离的思想。
      每一个类完成特定的独立的功能,这个就是高内聚。耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展。

       类之间的设置应该要低耦合,但是每个类应该要高内聚.耦合是类之间相互依赖的尺度.如果每个对象都有引用其它所有的对象,那么就有高耦合,这是不合乎要求的,因为在两个对象之间,潜在性地流动了太多信息.低耦合是合乎要求的:它意味着对象彼此之间更独立的工作.低耦合最小化了修改一个类而导致也要修改其它类的"连锁反应". 内聚是一个类中变量与方法连接强度的尺度.高内聚是值得要的,因为它意味着类可以更好地执行一项工作.低内聚是不好的,因为它表明类中的元素之间很少相关.成分之间相互有关联的模块是合乎要求的.每个方法也应该高内聚.大多数的方法只执行一个功能.不要在方法中添加'额外'的指令,这样会导致方法执行更多的函数。
      推广开来说,这个思想并不限于类与类之间的关系。模块和模块,子系统之间也都要遵守这个原则,才可以设计出延展性比较强的系统。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值