单一职责有两种含义:一是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责。遵循单一职责的目的:

(1)可以减少类之间的耦合(模块与模块之间的依赖关系)

减少类之间的耦合,当需求发生变化时,我们只需要修改一个类,从而也就隔离了变化;如果一个类有多个不同职责,它们耦合在一起,当一个职责发生改变时,可能会影响到其他职责。

(2)提高类的复用性

当只需要复用该类的一个职责时,由于与其他类耦合度过多,导致很难分离出。

遵循SRP在代发开发中的应用:

一、工厂模式

工厂模式允许在代码执行时实例化对象。它负责“生产”对象,最简单的工厂就是根据传入的类型名实例化对象。以数据库为例,也许在一个项目中需要不同种类数据库之间的数据交互,我们在之前需要定义多个数据库类,工厂模式的存在是我们可以根据不同的参数类型,实现不同数据库的调用。

首先我们定义一个适配器接口

interface Db_Adapter
{/** 数据库连接* @param $config 数据库配置* @return resource* */public  function connect($config);//接口的方法不能拥有主体/** 执行数据库查询* @param string $query 数据库查询SQL字符串* @param mixed $handle 连接对象* @return resource* */public function query($query,$handle);
}

这是一个简化的接口,并没有提供具体的方法,其定义了数据库的操作类,这个类实现了Db_Adapter接口

定义Mysql数据库的操作类

class Db_Adapter_Mysql implements Db_Adapter
{private $_dblink;//链接数据库字符串标识/** @param $config 数据库配置* @throw Db_Exception* @return resource* */public function connect($config){if($this->_dblink = @mysql_connect($config->HOST.(empty($config->PORT)?'':':'.$config->port),$config->USER,$config->PWD,true)) {if(@mysql_select_db($config->database,$config->_dblink)) {return $this->_dblink;} else{throw new Db_Exception(@mysql_error($config->_dblink));}}// TODO: Implement connect() method.}
      /** 执行数据库查询* @param string $query 数据库查询SQL字符串* @param mixed $handle 连接对象* @return resource* */
 public function query($query, $handle) { if ($resource = @mysql_query($query,$handle)) {
return $resource;
}
// TODO: Implement query() method. }}
下面定义一个SQLite数据库的操作类
class Db_Adapter_SQLite implements Db_Adapter
{private $_dblink;//链接数据库字符串标识/** @param $config 数据库配置* @throw Db_Exception* @return resource* */public function connect($config){if ($this->_dblink = sqlite_open($config->file,0066,$error)) {return $this->_dblink;}throw new Db_Exception($error);// TODO: Implement connect() method.}public function query($query, $handle){if ($resource = @sqlite_query($query,$handle)) {return $resource;}// TODO: Implement query() method.}
}
现在需要一个数据库操作方法的时候,只需定义一个工厂类
class SqlFactory
{public static function factory ($type) {if(include_once"Db_Adpater_{$type}.class.php") {$className = 'Db_Adapter_'.$type;return new $className;} else {throw new Exception('Driver not found');}}
}
调用时:
$db = sqlFactory::factory('Mysql');
我们把创建数据库连接这块单独拿出来,程序中的CRUD就不用关心是什么数据库了,只需要规划是哦那个对应的方法即可。工厂方法让具体的对象解放出来,使其不再依赖具体的类,而是抽象。

二、命令模式
设计模式里面的命令模式也是单一职责的体现,命令模式分离“命令的请求者”和“命令的实现者”方面的职责。比如说在一个餐馆里面,有厨师、服务员和顾客三种角色。作为顾客,只需要列出清单,传给服务员,由服务员通知厨师实现。作为服务员,只需要调用饭菜这个方法,厨师收到炒菜的请求,就立刻去做饭。在这里,命令的请求和实现就完成了解耦。
模拟这个过程,首先,定义厨师角色,处理进行实际的炒菜、做汤的操作。
/** 厨师,命令的接收者与执行者* */
class Cook
{public function meal () {echo "aaa",PHP_EOL; //做饭的命令}public function drink () {echo "bbb";//做汤的命令}
}interface Command{ //命令接口public function execute();
}
接下来模拟服务员和厨师的过程
//模拟厨师与服务员的过程
class MealCommand implements Command
{private $cook;//绑定命令接收者public function __construct(Cook $cook){$this->cook = $cook;}public function execute(){$this->cook->meal();// TODO: Implement execute() method.}
}class DrinkCommand implements Command
{private $cook;//绑定命令接收者public function __construct(Cook $cook){$this->cook = $cook;}public function execute(){$this->cook->drink();// TODO: Implement execute() method.}
}
模拟顾客和服务员的过程
class CookControler
{private $mealcommand;private $drinkcommand;//将命令发送者绑定到命令接收者上面(服务员)public function addCommand (Command $mealCommand,Command $drinkCommand) {$this->mealcommand = $mealCommand;$this->drinkcommand = $drinkCommand;}public function callMeal () {$this->mealcommand->execute();}public function callDrink () {$this->drinkcommand->execute();}
}

实现命令模式:
$cook = new Cook();
$mealCommand = new MealCommand($cook);
$drinkCommand = new DrinkCommand($cook);
$cookController = new CookControler();
$cookController->addCommand($mealCommand,$drinkCommand);
$cookController->callDrink();
$cookController->callMeal();
设计模式并非理论的东西,而是来源于生活。在设计模式方面体现的SRP的还有别的(代理模式),SRP是最简单的原则之一,也是最难设计的原则之一。

体现SRP(单一职责原则)的两种模式——工厂模式和命令模式相关推荐

  1. SOLID原则:单一职责原则(SRP)

    SOLID:SOLID 原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则.开闭原则.里式替换原则.接口隔离原则和依赖反转原则,SOLID 由5个设计原则的头一个字母组成. 如何 ...

  2. 单一职责原则是什么?

    单一职责原则是面向对象设计原则中的一条 举个简单的例子,假设,在工厂中,一款产品从无到有需要经过10种机器.我们是让10个人,每个人拿着原材料从第一台操作到第十台比较快,还是每个机器有一个单独的人专门 ...

  3. Java基础学习生疏知识点总结(4)——面向对象、单一职责原则、this关键字、构造方法

    文章目录 1.什么是对象? 2.什么是面向对象? 3. 什么是类? 4.单一职责原则 5.this关键字的应用 5.1 this.成员属性 5.2 this.成员方法() 5.3 this构造方法() ...

  4. 理论一:对于单一职责原则,如何判定某个的职责是否够“单一”?

    上几节课中,我们介绍了面向对象相关的知识.从今天起,我们开始学习一些经典的设计原则,其中包括,SOLID.KISS.YAGNI.DRY.LOD等. 这些设计原则,从字面上理解,都不难.你一看就感觉懂了 ...

  5. 设计模式之禅(读后感悟随笔)-单一职责原则

    一直以来,自己读过的技术类书籍也不少了,但是都犯了一个毛病就是没有很好的记录下来,有些东西可能并不是平日开发中时时刻刻用到的,随着时间的延长,学过的东西慢慢也就淡忘了,刚好最近有些时间,也正打算把&l ...

  6. 单一职责原则(SRP)

    单一职责原则(Single Pesponsibility Principle, SRP) 单一职责有两个含义: 一个是避免相同的职责分散到不同的类中, 别一个是避免一个类承担太多职责 为什么要遵守SR ...

  7. 单一职责原则(Single Responsibility Principle,SRP)

    1 简介 定义 不要存在多于一个导致类变更的原因. 特点 一个类/接口/方法只负责一项职责. 优点 降低类的复杂度.提高类的可读性,提高系统的可维护性.降低变更引起的风险. 名字容易让人望文生义,大部 ...

  8. 经典设计原则:单一职责原则(SRP)

    本文详解设计原则中的单一职责原则,目的还是提高代码的可读性.可扩展性.复用性.可维护性等. 目录 1. 单一职责原则(SRP) 2. 如何理解单一职责原则? 3. 如何判断类的职责是否足够单一? 4. ...

  9. 七种设计原则(二)单一职责原则

    2019独角兽企业重金招聘Python工程师标准>>> 1.定义 单一职责原则概念::规定一个类应该只有一个发生变化的原因. There should never be more t ...

最新文章

  1. 5GS 协议栈 — NR 空中接口协议栈
  2. 参数命名_北汽极狐ARCFOX 旗下首款车参数曝光,或命名MARK5
  3. Hibernate hql 查询指定字段并获取结果集
  4. centos7修改时间_Linux系统中文件时间属性介绍
  5. C# 引用类型与值类型转换-装箱和拆箱
  6. 如何判断链表中存在环路
  7. psql物化视图自动更新
  8. Python实战从入门到精通第十三讲——返回多个值的函数
  9. wince 错误 Error: failed PB timebomb check
  10. Ubuntu构建ARM交叉编译器
  11. 解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
  12. 如何用电脑下载网页中的视频?
  13. Github骚操作绑定中国+86手机号码实现两步验证
  14. elasticsearch中基于slop参数实现近似匹配
  15. 符号配对(C语言利用栈堆)
  16. Allegro如何改变线宽操作指导
  17. BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)
  18. C语言基础-数组逆序输出
  19. 模具腐蚀皮纹工艺原理及其流程
  20. Barrier与多线程

热门文章

  1. 初学者如何选择适合自己的吉他?0基础新手男女生吉他推荐
  2. Spring_背诵英文单词
  3. 八个数码管共阴c语言,LT-51S(STC89C52R):8个共阴极数码管-程序(2)
  4. First Order Methods in Optimization Ch5. Smoothness and Strong Convexity
  5. X Server移植指导之三 输出层移植 (XServer Porting Guide)
  6. 机器学习之Python Sklearn——线性回归
  7. torchvision.datasets.FashionMNIST报错[WinError 10054] 远程主机强迫关闭了一个现有的连接
  8. html调用js自动播放音乐,使用html js实现点击文本和播放音乐的功能
  9. LeetCode练习题:斐波那契数列
  10. 教师资格证考69分是怎么算的?