合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
**依赖倒转原则**:抽象不依赖细节,面向接口编程,传递参数尽量引用层次高的类。 1、上层模块不应该依赖底层模块,它们都应该依赖于抽象(依赖接口或抽象类,不要依赖具体的子类)。 2、抽象不应该依赖于细节,细节应该依赖于抽象。 即需求一旦修改,不能修改上层父类接口抽象类,而是修改下层的子类代码 ``` interface DBConnection { public function connect(); } class MySQLConnection implements DBConnection { public function connect() { // 连接 MySQL 数据库的逻辑 } } class OracleConnection implements DBConnection { public function connect() { // 连接 Oracle 数据库的逻辑 } } class UserManager { private $dbConnection; public function __construct(DBConnection $dbConnection) { $this->dbConnection = $dbConnection; } public function getUserById($userId) { $this->dbConnection->connect(); // 从数据库中获取用户信息的逻辑 } } $mysqlConnection = new MySQLConnection(); $userManager = new UserManager($mysqlConnection); $userManager->getUserById(1); $oracleConnection = new OracleConnection(); $userManager = new UserManager($oracleConnection); $userManager->getUserById(2); ``` 在上面的示例中,我们有两个数据库连接类 `MySQLConnection` 和 `OracleConnection`,它们都实现了 `DBConnection` 接口。`UserManager` 类依赖于 `DBConnection` 接口而不是具体的数据库连接实现,这样就可以在不修改 `UserManager` 类的情况下更换不同的数据库。 通过将依赖关系从具体实现改为抽象接口,我们提高了代码的灵活性和可扩展性。如果我们需要添加一个新的数据库连接类,只需要实现 `DBConnection` 接口即可,并且不会对 `UserManager` 类产生任何影响。 总之,依赖倒置原则要求高层模块依赖于抽象接口,而不是具体实现。这样可以减少模块之间的耦合性,提高代码的灵活性和可维护性。 ## **在依赖倒转时,往往进行依赖关系传递,目前与三种 方式** ### **第一种就是接口传递** ``` class Person{ public function receive(Email $email){ echo $email.getInfo(); } } class Email{ public function getInfo(){ return "邮件消息内容"; } } $p=new Person(); $email=new Email(); $p->receive($email); // 如果我们将接受消息改为接受传真,那么Person的receive方法参数则必须换成传真类 class Fax{ public function getInfo(){ return "传真消息内容"; } } class Person{ public function receive(Fax $fax){ echo $fax.getInfo(); } } $p=new Person(); $fax=new Fax(); $p->receive($fax); ``` 改进 ``` // 依赖倒置改进 class Person{ public function receive(IReceiver $email){ echo $email.getInfo(); } } interface IReceiver{ public function getInfo(); } class Email extends IReceiver{ public function getInfo(){ return "邮件消息内容"; } } class Fax extends IReceiver{ public function getInfo(){ return "传真消息内容"; } } $p=new Person(); $email=new Email(); $p->receive($email); $p=new Person(); $fax=new Fax(); $p->receive($fax ``` ### **第二种:构造方法传递** ``` class Person{ public $IReceiver=""; public function __construct(IReceiver $email){ $this->IReceiver=$email; } public function receive(){ echo ($this->IReceiver)->getInfo(); } } interface IReceiver{ public function getInfo(); } class Email extends IReceiver{ public function getInfo(){ return "邮件消息内容"; } } class Fax extends IReceiver{ public function getInfo(){ return "传真消息内容"; } } $email=new Email(); $p=new Person($email); $p->receive(); $fax=new Fax(); $p=new Person($fax); $p->receive(); ``` ### **第三种方法传递** ``` class Person{ public $IReceiver=""; public function setME(IReceiver $email){ $this->IReceiver=$email; } public function receive(){ echo ($this->IReceiver)->getInfo(); } } interface IReceiver{ public function getInfo(); } class Email extends IReceiver{ public function getInfo(){ return "邮件消息内容"; } } class Fax extends IReceiver{ public function getInfo(){ return "传真消息内容"; } } $email=new Email(); $p=new Person(); $p->setME($email); $p->receive(); $fax=new Fax(); $p=new Person(); $p->setME($email); $p->receive(); ```