`
wangym
  • 浏览: 123358 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

六大设计原则之“单一职责原则”

阅读更多

单一职责原则的定义是:应该有且仅有一个原因引起类的变更。

 

举例一:电话

 

传统设计:

一个接口类

1.IPhone:dial(),chat(),hangup()

一个实现类

1.Phone

 

演变思想:

因为dial和hangup实现的是协议管理,而chat实现的是数据传送;协议的接通和数据的传送都会引起这个接口类或实现类的变化;如拨号和挂断方法只管连接和断开,之后是不关心数据的传送;若按传统设计,一个类就包含了两个职责。

 

符合该原则的设计:

两个接口类

1.IConnectionManager:dial(),hangup()

2.IDataTransfer:DataTransfer(IConnectionManager cm )

一个实现类

1.Phone

 

演变问题:

问:为什么演变成两个接口类后,却只有一个实现类,而不是给每一个接口都去实现一下,再强耦合成一个Phone类呢?两个接口是满足了单一职责原则,但实现类仍然没满足,实现类仍然会因两个原因而引变化呀?

答:是的。但若分别有两个实现类,组合在一起后再形成Phone类才能使用,那么组合就是强耦合,增加了类的数据和复杂度,而且在面向接口编程中,对外公开的是接口,而不是实现类。

 

接口一定要做到单一职责,而实现类的设计尽量 做到只有一个原因引起变化。

 

举例二:用户

 

传统设计:

一个接口类

1.IUserInfo:setUserId(),getUserId(),setUserName(),getUserName(),changePassword(),addNewUser()

一个实现类

1.UserInfo

 

演变思想:

用户的属性(userId,userName等)没有和用户的行为分开,这是一个严重的错误,应该把属性抽取成一个BO(业务对像),行为抽取成一个Biz(业务逻辑)。

 

符合该原则的设计:

两个接口类

1.IUserBO:setUserId(),getUserId(),setUserName(),getUserName()

2.IUserBiz:changePassword(),addNewUser()

一个实现类

1.UserInfo

 

使用时如:

......

// 要赋值了就认为它是一个纯粹的BO

IUserBO userBO = (IUserBO) userInfo();

userBO.getUserId();

......

// 要执行动作了就认为它是一个逻辑类

IUserBiz userInfo = (IUserBiz) userInfo();

userInfo.addNewUser();

 

也适用对方法的设计

 

单一职责适用于接口、类,也同样适用于类里面的方法,即一个方法尽可能做一件事情。

比如修改用户信息,根据传递类型的不同,把可变长度的参数修改到userBO这个对像上,并写入数据库:

 

boolean changeUserInfo(IUserBO userBO, String... changeOptions);

 

这个方法的设计不符合该原则,因为方法的职责不清晰,不单一,不要让别人去猜测这个方法是用来处理什么逻辑的。

比如好的设计如:

 

boolean changeUserName(String newUserName);

boolean changeTel(String newTel);

 

 

 

分享到:
评论

相关推荐

    设计模式六大原则(1):单一职责原则

    NULL 博文链接:https://lijie-insist.iteye.com/blog/2190970

    IOS设计模式

    1、 IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle) 定义  就一个类而言,应该仅有一个引起它变化的原因。 定义解读  这是六大原则中最简单的一种,通俗点说,就是不存在多个...

    设计模式之六大原则详解,Markdown笔记

    详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。

    设计模式六大原则

    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则...

    php 设计模式六大原则

    php 设计模式六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 word版

    设计模式六大原则.doc

    设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则...

    设计模式六大原则 设计模式详解

    详细介绍设计模式的六大原则,有不足之处希望大家多指教。参考《设计模式之禅》

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    1.单一职责原则: 不要存在多于一个导致类变更的原因 2.里氏替换法则:子类可以扩展父类的功能,但不能改变父类原有的功能 3.依赖倒置原则:面向接口编程 4.接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对...

    24种设计模式与6大设计原则

    策略模式[STRATEGY PATTERN] 代理模式[PROXY PATTERN] 单例模式[SINGLETON PATTERN] 多例模式[MULTITION PATTERN] ...六大设计原则:单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则,开闭原则。

    JAVA六大原则代码.zip

    单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因,即一个类应该只有一个职责。这个原则鼓励将不同的功能分离到不同的类中,以减少类的复杂性,提高代码的可维护性。 ...

    浅谈C#六大设计原则

    这六种原则分别为单一职责原则、接口隔离原则、里氏替换原则、迪米特法则、依赖倒置原则、开闭原则。 单一职责原则 单一职责原则(SRP:Single responsibility principle),规定一个类中应该只有一个原因引起类的...

    设计模式6大原则.doc

    设计模式六大原则:单一职责模式、开闭原则、接口隔离原则、里氏替换原则、依赖倒置原则、迪米特法则

    程序设计六大原则及代码样例

    本文档非常详细的介绍了程序设计六大原则的定义,问题由来,解决方案及代码样例。

    24个设计模式与6大设计原则

    26.1 单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】 290 26.2 里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】 297 26.3 依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】 309 26.4 接口隔离原则...

    设计模式总结

    单一职责原则(Single Responsibility Principle,简称SRP) 有且仅有一个原因引起类的变更。 里氏替换原则(Liskov Substitution Principle,LSP) 只要父类出现的地方都可以用子类替换。 依赖倒置原则...

    Beatles9527#StudyNotes#_1设计模式六大原则1

    1. 单一职责原则 2. 依赖倒置原则 3. 迪米特法则 4. 开放-封闭原则 5. 里氏替换原则(了解) 6. 接口隔离原则(了解)

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

Global site tag (gtag.js) - Google Analytics