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 a simple smtp class
Nov 26 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
php5.x禁用eval的操作方法
Oct 19 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
PHP中多字节字符串操作实例详解
Aug 23 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
php 保留小数点
2009/04/21 PHP
8个必备的PHP功能实例代码
2013/10/27 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
jQuery中读取json文件示例代码
2013/05/10 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
python删除列表内容
2015/08/04 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
智能室内花园:Click & Grow
2021/01/29 全球购物
无毒社区工作方案
2014/05/23 职场文书
暑期培训班招生方案
2014/08/26 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
Python 中 Shutil 模块详情
2021/11/11 Python
利用JavaScript写一个简单计算器
2021/11/27 Javascript
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技