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生成带有雪花背景的验证码
Oct 09 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
分享PHP header函数使用教程
Sep 05 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
php身份证号码检查类实例
Jun 18 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
PHP安全下载文件的方法
Apr 07 PHP
PHP中overload与override的区别
Feb 13 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
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获取后台Job管理的实现代码
2011/06/10 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
BootStrap中
2016/12/10 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
2020/04/27 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
用python代码做configure文件
2014/07/20 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
销售2014年度工作总结
2014/12/08 职场文书
办公室主任个人总结
2015/02/28 职场文书
预备党员自我评价范文
2015/03/04 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
Python代码实现双链表
2022/05/25 Python