`
wangym
  • 浏览: 124583 次
  • 性别: 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):单一职责原则

    本文将深入探讨这六大原则中的第一个——单一职责原则(Single Responsibility Principle, SRP),并结合AcountYear.java这个文件名来解析该原则的应用。 单一职责原则指出,一个类或者一个模块应该只有一个引起它...

    IOS设计模式

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

    单一职责模式例子。

    在软件设计领域,单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的六大原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中提出。这个原则强调一个类或者模块应当...

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

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

    设计模式六大原则与类的六种关系

    六大原则分别是:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则和开闭原则。 1. 单一职责原则(Single Responsibility Principle) 单一职责原则是指一个类只负责一项职责。问题来源于类 T...

    六大设计原则,一些小例子(通俗易懂)

    1. 单一职责原则(Single Responsibility Principle, SRP) 这个原则指出,一个类或模块应该只有一个改变的原因。这意味着一个类应该只做一件事情,保持职责单一。例如,一个用户管理类只负责处理用户数据,而不是...

    php 设计模式六大原则

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

    设计模式六大原则

    设计模式的六大原则是软件开发中的重要指导原则,它们旨在提高代码的可维护性、可扩展性和可重用性。以下是对这六大原则的详细解释: 1. 单一职责原则(Single Responsibility Principle, SRP) 这个原则强调一个...

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

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

    六大设计原则.docx

    【六大设计原则】是软件开发中的核心指导原则,它们包括单一职责原则(Single Responsibility Principle,SRP)、开闭原则(Open Closed Principle,OCP)、里氏替换原则(Liskov Substitution Principle,LSP)、...

    设计模式六大原则.doc

    设计模式六大原则是软件开发中不可或缺的指导方针,它们旨在提升代码的可维护性、可扩展性和可重用性。以下是对这些原则的详细解释: 1. 单一职责原则(Single Responsibility Principle, SRP): 这个原则强调一个...

    浅谈C#六大设计原则

    单一职责原则(Single Responsibility Principle,SRP)是软件设计中的核心原则之一,它主张一个类或组件应该有且只有一个职责,即一个类只做一件事情。这样做的目的是为了提高类的内聚性,降低类之间的耦合度。在...

    java面向对象设计的六大原则

    以下将详细介绍面向对象设计的六大原则:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则...

    JAVA 24种设计模式介绍与6大设计原则.pdf

    1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因,即类中的方法都应该聚集在一个单一的功能上。 2. 里氏替换原则(Liskov Substitution Principle, LSP):子类应该...

    java六大设计原则 个人见解层次分明

    1. 单一职责原则(Single Responsibility Principle, SRP): 这个原则规定,一个类或模块应该有且只有一个职责,即它只做一件事情。这样可以降低类的复杂性,提高代码的可读性和可维护性。例如,如果你有一个用户...

    程序员必备的七大面向对象设计原则

    单一职责原则定义为:一个类应该只有一个理由去改变。单一职责原则的目的是为了提高类的内聚性和可维护性。 四、接口隔离原则 接口隔离原则定义为:客户端不应该被迫依赖于它不使用的接口。接口隔离原则的目的是...

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

    程序设计六大原则是软件开发中不可或缺的指导方针,它们旨在提高代码的可读性、可维护性和可扩展性。这六个原则包括单一职责原则(Single Responsibility Principle, SRP)、里氏替换原则(Liskov Substitution ...

Global site tag (gtag.js) - Google Analytics