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实现单链表的实例代码
Mar 22 PHP
PHP可变函数的使用详解
Jun 14 PHP
深入解析php中的foreach函数
Aug 31 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
php json中文编码为null的解决办法
Dec 14 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
php file_get_contents取文件中数组元素的方法
Apr 01 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
laravel model 两表联查示例
Oct 24 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
npm qs模块使用详解
2020/02/07 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
python的类方法和静态方法
2014/12/13 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
中文系师范生自荐信
2013/10/01 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
简单租房协议书
2014/04/09 职场文书
毕业证委托书范文
2014/09/26 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS