这种模式提供了一种简单的解耦多组件之间的协同工作方式。如果你有一个“智能中心”,比如控制器(但不是 MVC 的意义上),它是观察者的一个很好的替代品。
所有组件(称为同事)仅与 Mediator 接口耦合,这是一件好事,因为在 OOP 中,一个好朋友胜过多个。这是这种模式的关键特征。
Mediator.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralMediator; interface Mediator { public function getUser(string $username): string; }
Colleague.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralMediator; abstract class Colleague { protected Mediator $mediator; public function setMediator(Mediator $mediator) { $this->mediator = $mediator; } }
Ui.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralMediator; class Ui extends Colleague { public function outputUserInfo(string $username) { echo $this->mediator->getUser($username); } }
UserRepository.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralMediator; class UserRepository extends Colleague { public function getUserName(string $user): string { return "User: " . $user; } }
UserRepositoryUiMediator.php
<?php declare(strict_types=1); namespace DesignPatternsBehavioralMediator; class UserRepositoryUiMediator implements Mediator { public function __construct(private UserRepository $userRepository, private Ui $ui) { $this->userRepository->setMediator($this); $this->ui->setMediator($this); } public function printInfoAbout(string $user) { $this->ui->outputUserInfo($user); } public function getUser(string $username): string { return $this->userRepository->getUserName($username); } }
Tests/MediatorTest.php
<?php declare(strict_types=1); namespace DesignPatternsTestsMediatorTests; use DesignPatternsBehavioralMediatorUi; use DesignPatternsBehavioralMediatorUserRepository; use DesignPatternsBehavioralMediatorUserRepositoryUiMediator; use PHPUnitFrameworkTestCase; class MediatorTest extends TestCase { public function testOutputHelloWorld() { $mediator = new UserRepositoryUiMediator(new UserRepository(), new Ui()); $this->expectOutputString("User: Dominik"); $mediator->printInfoAbout("Dominik"); } }
目的相比 简单工厂模式(SimpleFactory)而言,工厂方法模式(Factory Method)可以通过延伸出子类,实现用不同的方法创建对象。...
黑盒测试,白盒测试与灰盒测试的比较和区别如下所示:编号黑盒测试白盒测试灰盒测试1不需要了解内部工作结构(代码)。测试用例只...
定位符是小型数据结构,包含用于访问LOB实际数据的信息。在数据库的表中,定位符直接存储在表中,而数据可以存储在表中或单...
可以使用 Fetch Size 更改行获取值来更改每次访问数据库游标时检索的行数。默认情况下,OceanBase Connector/J 运行查询时,默认...