写点什么

第二周作业

用户头像
关注
发布于: 2020 年 06 月 17 日



作业一:

  • 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

依赖倒置原则是设计模式六大原则中的一大原则,它的定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

如何理解: 模块与模块之间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。

举个例子: 司机驾驶宝马,张三驾驶奔驰

面向过程的做法





随着后面不同人驾驶不同的车,程序只会变成越来越臃肿,越来越难维护。

按照依赖倒置原则设计,我们可以把场景抽象为, 驾驶员驾驶车,也就是驾驶员IDriver依赖于车ICar,所有的驾驶员实现IDriver,所有车实现ICar即可,以后不管什么人驾驶什么车, 增加新的实现即可,无需改动原来的代码。



至于依赖倒置原则为什么又被称为好莱坞原则?

好莱坞原则是不要给我们打电话,我们会给你打电话。那么按照系统设计角度去理解,"你"是高层组件, “我们”(好莱坞)是底层组件,高层组件不应该直接调用底层组件,让底层组件去调用高层组件。

这个概念正好符合依赖倒置原则中, 高层模块不应该依赖底层模块,细节应该依赖抽象。



作业二:

  • 请描述一个你熟悉的框架,是如何实现依赖倒置原则的。

以当前在用php 框架Lavarel 为例,它是以MC的软件架构模式设计的,其中用户数据提供者的数据库连接这块就按照依赖倒置原则设计的。用户数据提供者调用底层连接接口,各种数据库连接实现底层连接接口,那么用户数据提供者不管数据连接是Mysql,还是Sql server都无需变动调用代码。

下面是代码实例:

DatabaseUserProvider.php

<?php
namespace Illuminate\Auth;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
class DatabaseUserProvider implements UserProvider
{
protected $conn;
protected $hasher;
protected $table;
public function __construct(ConnectionInterface $conn, HasherContract $hasher, $table)
{
$this->conn = $conn;
$this->table = $table;
$this->hasher = $hasher;
}
}

ConnectionInterface.php

<?php
namespace Illuminate\Database;
use Closure;
interface ConnectionInterface
{
public function table($table);
public function raw($value);
public function selectOne($query, $bindings = []);
public function select($query, $bindings = []);
public function insert($query, $bindings = []);
public function update($query, $bindings = []);
public function delete($query, $bindings = []);
public function statement($query, $bindings = []);
public function affectingStatement($query, $bindings = []);
public function unprepared($query);
public function prepareBindings(array $bindings);
public function transaction(Closure $callback, $attempts = 1);
public function beginTransaction();
public function commit();
public function rollBack();
public function transactionLevel();
public function pretend(Closure $callback);
}

Connection.php

<?php
namespace Illuminate\Database;
class Connection implements ConnectionInterface
{
}





作业三:

请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。



如图



发布于: 2020 年 06 月 17 日阅读数: 49
用户头像

关注

还未添加个人签名 2018.05.10 加入

还未添加个人简介

评论

发布
暂无评论
第二周作业