如何使用接口实现松耦合?

2024-02-17

我似乎不明白接口如何实现松耦合的概念?您可能会发现这个问题与其他问题重复,但我已经阅读了许多与该主题相关的答案,但没有找到令人满意的解释。

下面是许多开发人员实现松散耦合的示例。

interface shape {
   public function sayName();
}

class Circle implements shape {

     public function sayName(){
          echo 'Hello my name is circle';
      }
}

class Square implements shape {

     public function sayName(){
          echo 'Hello my name is square';
      }
}

class Creator {
       public $shape = null;
       public function __construct(Shape $shape){
          $this->shape = $shape;
       }
}

$circle = new Creator(new Circle());
$circle->sayName();

$square = new Creator(new Square());
$square->sayName();

在上面的例子中我们使用接口的多态性来实现松耦合。但我不认为这段代码是松散耦合的。在上面的示例中,调用代码(客户端)使用“new”运算符直接引用“Circle”和“Square”类,因此创建了紧密耦合。

为了解决这个问题,我们可以这样做。

界面形状{ 公共函数 sayName(); }

class Circle implements shape {

     public function sayName(){
          echo 'Hello my name is circle';
      }
}

class Square implements shape {

     public function sayName(){
          echo 'Hello my name is square';
      }
}

class Creator {
       public $shape = null;
       public function __construct($type){
          if(strtolower($type) == 'circle'){
             $this->shape = new Circle();
          } else if(strtolower($type) == 'square'){
             $this->shape = new Square();
          } else {
             throw new Exception('Sorry we don\'t have '.$type.' shape');
          }
       }
}

$circle = new Creator('Circle');
$circle->sayName();

$square = new Creator('Square');
$square->sayName();

这个例子解决了前面例子的问题,但我们根本不使用接口。

我的问题是,如果我可以在不使用接口的情况下实现松耦合,为什么还要使用接口?在上述场景中该接口会带来什么好处?或者如果我不使用上面示例中的接口,我会遇到什么问题?

感谢您的帮助。


正如其他人所指出的,您所做的更多是依赖注入,这是一个相关但与松散耦合不同的主题。我将尝试通过接口深入了解松散耦合的简单应用。

我倾向于将接口视为定义/执行契约的便捷方式。不要考虑每个形状都可以打招呼的简单示例,而是考虑需要将每个形状渲染到图像的情况。

此伪代码显示了如何在没有界面的情况下处理正方形和圆形。

class Circle {
  function renderCircle() { ... }
}

class Square {
  function renderSquare() { ... }
}

// then when we use them
Circle[] circlesArray = loadCircles
Square[] squaresArray = loadSquares

foreach(circle in circlesArray){
  circle.renderCircle
}

foreach(square in squaresArray){
  square.renderSquare
}

相反,如果我们说我们不太关心什么type它的形状,但只有你可以渲染它,我们最终得到以下界面:

interface renderableShape {
  function render()
}

等等,在您只关心渲染形状的能力的情况下,您可以编程against那个界面。

你可以有这样的东西:

function renderShapes(Array[renderableShape] shapes){
  foreach(shape in shapes){
    shape.render()
  }
}

您现在要确保您的renderShapes函数无法了解 Circle 或 Square 实现的任何具体细节。它需要知道的是你可以打电话render.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用接口实现松耦合? 的相关文章

  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • php paypal 服务器端 REST 集成失败

    我无法发布代码 错误等 因为 你需要至少 10 个声誉才能发布 2 个以上的链接 并且所有内容都包含很多链接 只是花了几个小时写了一篇完整详细的帖子 我在这里 和其他地方 读过类似的帖子 但它们没有帮助 我基本上遵循 https devel
  • openssl_crypt 中初始化向量的使用

    我看了一下this https stackoverflow com questions 1391132 two way encryption in php问题 并想为自己做 当我运行这段代码时 直接取自这个答案 https stackove
  • PHP - SQLite 与 SQLite3

    我已经使用 SQLite 2 8 17 制作了一个 Web 应用程序 我现在才发现有一个 SQLite3 在制作 Web 应用程序时 它以某种方式逃避了我的注意 可能是由于缺少 php 函数的文档 我想知道 使用 SQLite3 比 SQL
  • 表单请求中的 Laravel 数组验证

    我无法验证 Form Request 类中包含数组元素的字段 规则方法 public function rules return state gt required state 0 gt required state gt required
  • laravel Blade 模板不渲染

    进入 Laravel 后 我尝试使用 Blade 模板 但它没有渲染 我的所有示例都来自 Laravel 文档 UPDATE 所以这是我的master blade php 文件位于资源 gt 视图 gt master blade php y
  • PHP三元运算符错误[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 三元运算符未按预期工作 https stackoverflow com questions 14214427 php ternary operator not working as expec
  • Codeigniter - 检查用户是否已登录并存在(它是真实用户)

    我正在尝试在用户登录我的网站时为他们设置会话数据 因此 如果用户存在于数据库中 我将设置一个会话数据 例如 this gt session gt set userdata user exists 1 现在 每次我想检查用户是否存在并已登录时
  • dompdf 在文档末尾插入空白页

    我正在使用 dompdf 0 6 0 生成 pdf 文档 并且遇到一个奇怪的问题 即最后创建了一个空白页面 我的 简化的 html
  • \r 和 \n 在 PHP(和其他语言)中意味着什么?

    这些叫什么 r n 有解释它们的教程吗 它们分别是 回车 和 换行 通常在 Windows 上 您需要将两者一起表示行终止符 r n 而在大多数 全部 Unix 系统上 n 就足够了 See the 维基百科换行条目 http en wik
  • PHP preg_match_all 100 MB 文件

    我读到 preg match all 不是为解析大文件而设计的 但我需要这样做 我增加了 pcre backtrack limit 1000000000 pcre recursion limit 1000000000 我的 PHP memo
  • 如何从 php 代码更改 php 设置?

    我想更改 php 设置 但从 php 页面而不是 php ini 更改 我要更改的设置是 upload max filesize post max size and memory limit 如果您有AllowOverride 选项 您可以
  • 为什么我的变量超出范围? PHP

    语言是 Apache 2 2 服务器上的 PHP 5 4 这是一个由ajax调用的脚本 usr new User function getMyName echo usr gt username getMyName 由于某种原因 name 超
  • 使用composer create-project安装特定的laravel 5版本

    今天我尝试安装特定的 laravel 版本composer create project laravel laravel 5 1 8 your project name prefer dist 因为有些插件在5 1 9及以上版本有问题 但是
  • PHP 中比较运算符“==”的混淆

    In PHP null 0 0 0 如果将这两者结合起来 您会期望 null 0 但是这是错误的 有人可以向我解释一下吗 在第一种情况下 null 0 null评估为false 与 一样0其评估结果为false 所以两者都是false所以比
  • 如何在 PHP 中修剪定界文档(长字符串)中的每一行

    我正在创建一个 PHP 函数 可以修剪长字符串中的每一行 例如
  • 在php中将数组写入文件并获取数据

    我有一个数组 使用后如下所示print r Array 0 gt Array 0 gt piklu name gt piklu 1 gt Array 0 gt arindam name gt arindam 2 gt Array 0 gt
  • 在仅包含键的字符串的嵌套数组中查找值

    我有一个数组 其中包含一些设置 基本上如下所示 defaults array variable gt value thearray gt array foo gt bar myvar gt array morevars gt moreval
  • 在订单项目视图中显示自定义产品数据

    我在添加到购物车时遇到问题 我有一个具有不同定制条件的产品可供选择 当客户选择特定选项时 它添加到购物车 当客户选择另一种选择并添加时 它显示为购物车中的第二件商品 这没关系 但付款后 订单在第 1 项和第 2 项下均显示自定义选项 但没有
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确

随机推荐

  • 如何在python源代码中找到运算符的定义?

    我对 in 的实现感到好奇 contains python 中的运算符由于这个问题 https stackoverflow com questions 9089400 python set in operator uses equality
  • 如果页面加载失败,如何运行 Tampermonkey 脚本?

    我有一个在服务器页面上运行的脚本 有时发送不会将任何内容发送回客户端 我得到未收到数据Chrome 中的错误 我想注册此事件 通过 AJAX 通知另一台服务器 然后重新加载页面 即使页面加载失败 如何确保脚本运行 None
  • 如何在Angular中的地图上动态绘制多边形形状

    如何动态绘制多边形形状 未预定义paths 以及如何存储多边形的经纬度值 我已经参考了AGMP多边形 https angular maps com api docs agm core directives AgmPolygon html但这
  • 如何检查从 C++ 字符串到无符号整数的转换

    我需要 1 找出我当前系统上最大的 unsigned int 值是多少 我在 limit h 上没有找到它 写起来安全吗unsigned int maxUnsInt 0 1 我也尝试过unsigned int maxUnsInt MAX I
  • 捕获目录内发生的事件

    我正在使用以下方式观看目录Java 7 nio WatchService通过使用以下方法 Path myDir Paths get rootDir try WatchService watcher myDir getFileSystem n
  • 访问 Access 2013 数据库的架构

    如果我尝试读取 Access 2013 数据库的架构 我会收到以下错误 no read permission on MSysRelationships 现在帮助告诉我 User level security features are not
  • 如何将类添加到 simple_form 2 包装器中的输入组件

    我正在努力拥有class text 在我的输入字段中使用名为 hinted in simple form 2 0 0 rc 的自定义包装器时 config wrappers hinted do b b use input class gt
  • 为什么这个 TensorFlow 实现远不如 Matlab 的神经网络成功?

    作为一个玩具示例 我正在尝试拟合一个函数f x 1 x来自 100 个无噪声数据点 matlab 默认实现非常成功 均方差约为 10 10 并且插值完美 我实现了一个神经网络 其中一个隐藏层包含 10 个 S 型神经元 我是神经网络的初学者
  • NodeJS 中是否可以实现多线程?

    所以我有一个应用程序Socket IO其目的是在不同站点上搜索一些数据 像爬虫之类的东西 主要问题是搜索过程太长 当它发生时我的应用程序卡住了 例如 如果一个用户开始第二次搜索需要等到第一次完成 每个需要搜索的网站都表示为一个单独的类 因此
  • 使用 sed 将带有斜杠的已定义变量的文本替换为空格[重复]

    这个问题在这里已经有答案了 我正在尝试使用 sed 来用已定义的变量替换带有空格的行 例如 我想用 lan 和 lan afile py 替换 哑字符串 我以为这条线是 sed s a dumb string lan g file txt
  • 当程序员使用术语“暴力解决问题的方法”时,他们的意思是什么?

    我想了解程序员在工作中使用术语 暴力 时通常意味着什么 许多编程问题都是对数据空间的搜索 例如列表 树 图等的遍历 在解决问题时 所有数据都被搜索或遍历 如果人们想让代码更快 他们就会开始注意到可用于删除搜索空间中不必要部分的模式 当代码搜
  • 业力打字稿找不到模块

    我有一个非常小的项目 我正在尝试为其设置单元测试 该项目使用时编译良好tsc直接地但是 在尝试执行使用 karma typescript 框架的测试时 我收到以下 Typescript 编译错误 ERRORS 错误 compiler kar
  • 将 XML 扁平化为 HTML 表格

    必须有一种通用方法来转换某些分层 XML 例如
  • PHPUnit 测试函数,具有通过引用传递的值和返回值

    大家好 我需要测试一段调用另一个类的函数的代码 我现在无法编辑 我只需要测试它 但问题是这个函数有一个通过引用传递的值和一个返回的值 所以我不知道如何模拟它 这是列类的功能 public function functionWithValue
  • 将 strstream 转换为 sstream 关​​于 c_str() 的冲突

    我有这样的代码块strstream 我把它转换为sstream如下 我不确定 但我认为printStream gt str 返回一个字符串对象 其中包含由指向的流缓冲区中的内容的副本 临时 printStream 然后你调用c str 并得
  • 阻止 Visual Studio 自动更改 IIS 虚拟目录的物理路径?

    我有一个 Visual Studio 解决方案 其中包含一个 Web 应用程序项目 以及其他一些项目 Visual Studio 典型 设置似乎坚持认为二进制文件的输出目录位于项目源目录的根目录中 特别是 每次打开Web应用程序项目时 Vi
  • iOS 10.1 启动应用程序时出现警告

    为什么应用程序收到此警报以及如何解决此问题 AppName 可能会减慢您的 iPhone 该应用程序的开发人员需要更新它以提高其兼容性 我已经浏览过这个链接 iOS 10 1 模拟器显示 应用程序可能会减慢您的 iPhone 速度 http
  • 获取使用 calc 等表达式的 CSS 变量的计算值

    在 JavaScript 中 您可以使用以下命令获取 CSS 变量的值getPropertyValue property https developer mozilla org en US docs Web API CSSStyleDecl
  • Sinatra/Rack 的一个非常简单的身份验证方案是什么

    我正忙于将一个非常小的 Web 应用程序从 ASP NET MVC 2 移植到 Ruby Sinatra 在 MVC 应用程序中 当根据数据库正确验证用户登录时 FormsAuthentication SetAuthCookie 用于设置持
  • 如何使用接口实现松耦合?

    我似乎不明白接口如何实现松耦合的概念 您可能会发现这个问题与其他问题重复 但我已经阅读了许多与该主题相关的答案 但没有找到令人满意的解释 下面是许多开发人员实现松散耦合的示例 interface shape public function