PHP耦合设计模式实例分析


Posted in PHP onAugust 08, 2018

本文实例分析了PHP耦合设计模式。分享给大家供大家参考,具体如下:

一个软件,它具有许多类,类与类之间需要互相调用,一旦某个类与另一个类具有紧密耦合关系的时候,这个软件的重用性就会大大降低。所以一个软件的重用性的高低就取决于它的耦合程度的高低。

耦合度:程序模块之间的关联、依赖程度。

在设计过程中提出:当设计这个软件的体系结构的时候,就发现了这个软件的逻辑运行部分(SimpleRouter类)和输出部分(SimpleRouterFrame类)不能很好的结合起来。即:我们不得不将程序界面的引用(reference to SimpleRouterFrame)一层一层的传递给程序的核心部分,以提供输出功能。

在开发过程中提出:当我们对输出界面(SimpleRouterFrame类)进行了一些修改后,特别是某些方法名称修改后,相应程序核心部分(SimpleRouter类)的代码也需要重新修改以适应这个新的输出界面。

问题的原因:类与类之间耦合的过于紧密,以至于每次需要修改一个类,它相应的关联类都需要修改代码来适应这个修改过的类。 比如说:某个类A需要直接显示的调用另一个类B的public方法,一旦B不再支持这个方法,或者重写了这个方法名称,A就需要重新编写代码来适应。另一种情况:某类A需要用到具有某种特定方法的类B,但B的形式并不确定,一旦B的内部结构改变,A就可能需要重写代码。

为避免这种情况,需要降低A与B之间的耦合度,不论形式如何,只要B仍然能够实现A所需要的功能,A就不需要重写代码, 解决方法:令B实现某种接口I,定义 I.Method(); 同时A在调用B的方法时候直接调用I的方法即可;而从前会将B当作参数传给A,然后A再调用B的方法的地方

{
  A.AMethod( B b ) {
    b.BMethod();
    /*….*/
  }
}

修改成:

{
  A.AMethod( I i ) {
    i.Method();
  }
}

在这里,B只需要实现I.Method()方法即可,完全隐藏了实现细节。 按照这种方法,既实现了类与类之间的松散耦合,大大增强了类的可重用性。回顾从前学过的设计模式,可以发现,这与Observer模式有相似之处。

下面是一个完整的例子:

<?php
interface Calculation {
  function compute($a, $b);
}
class Addition implements Calculation {
  function compute($a, $b)
  {
    return "加法运算结果为:".($a+$b);
  }
}
class Subtraction implements Calculation {
  function compute($a, $b)
  {
    return "减法运算结果为:".($a-$b);
  }
}
class Multiplication implements Calculation {
  function compute($a, $b)
  {
    return "乘法运算结果为:".($a*$b);
  }
}
class Division implements Calculation{
  function compute($a, $b)
  {
    return "除法运算结果为:".($a/$b);
  }
}
class Modf implements Calculation {
  function compute($a, $b)
  {
    return "取模运算结果为:".($a % $b);
  }
}
class Coupling implements Calculation {
  //这里直接:public $varl = new LazyDog(); 会出错。
  public $varl = null;
  function __construct()
  {
    $this->varl = new LazyDog();
  }
  function compute($a, $b)
  {
    return $this->varl->say();
  }
}
/*也可以用继承的方式实现哟:
class Coupling extends LazyDog implements Calculation {
  function compute($a, $b)
  {
    return parent::say();
  }
}
*/
class LazyDog {
  function say()
  {
    return "我什么运算都不做...只是为了实现'耦合设计模式'...我是出来打酱油的......";
  }
}
class Test {
  private $one;
  private $two;
  public function __construct($x,$y)
  {
    $this->one=$x;
    $this->two=$y;
    echo "Class Test 初始化:属性\$one=".$this->one.",属性\$two=".$this->two."<hr />";
  }
  function display(Calculation $a){
    return "用PHP接口技术实现的运算:".$a->compute($this->one,$this->two)."<hr />";
  }
}
$t = new Test(96,12);
$t1 = new Addition();
$t2 = new Subtraction();
$t3 = new Multiplication();
$t4 = new Division();
$t5 = new Modf();
$dog = new Coupling();
echo $t->display($t1);
echo $t->display($t2);
echo $t->display($t3);
echo $t->display($t4);
echo $t->display($t5);
echo $t->display($dog);
?>

程序运行结果:

Class Test 初始化:属性$one=96,属性$two=12
用PHP接口技术实现的运算:加法运算结果为:108
用PHP接口技术实现的运算:减法运算结果为:84
用PHP接口技术实现的运算:乘法运算结果为:1152
用PHP接口技术实现的运算:除法运算结果为:8
用PHP接口技术实现的运算:取模运算结果为:0
用PHP接口技术实现的运算:我什么运算都不做...只是为了实现'耦合设计模式'...我是出来打酱油的......

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php error_log 函数的使用
Apr 13 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
php数组键名技巧小结
Feb 17 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
安装docker和docker-compose实例详解
Jul 30 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 #PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 #PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 #PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 #PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 #PHP
PHP实现普通hash分布式算法简单示例
Aug 06 #PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 #PHP
You might like
php中防止伪造跨站请求的小招式
2011/09/02 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP解析RSS的方法
2015/03/05 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
Python的print用法示例
2014/02/11 Python
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python 重定向获取真实url的方法
2018/05/11 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
软件工程师岗位职责
2013/11/16 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
营销计划书
2015/01/17 职场文书
品德与社会教学反思
2016/02/24 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
logback如何自定义日志存储
2021/08/30 Java/Android
python使用torch随机初始化参数
2022/03/22 Python
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL