- facade门面
外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
作用:
1、它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便
2、实现了子系统与客户之间的松耦合关系
3、如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择- 容器与依赖注入
当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部。- MVC架构
m:model模型层
v:view视图层
c:controller控制器层model层
<?php
namespace mvc_demo;
use PDO;
class Model
{
//获取数据
public function getData()
{
return (new PDO('mysql:host=localhost;dbname=phpedu','root','zhoujielun521'))->query("SELECT `id`,`uname`,`gender` FROM `users` ORDER BY `id` asc LIMIT 0,10")->fetchAll(PDO::FETCH_ASSOC);
}
}
// print_r((new Model)->getData());
视图层
<?php
namespace mvc_demo;
class View {
public function fetch($data)
{
$table = '<table>';
$table.='<caption>用户信息表</caption>';
$table.= '<tr><th>编号</th><th>姓名</th><th>性别</th></tr>';
foreach($data as $user)
{
$user['gender'] = $user['gender'] == 1 ?'男' : '女';
$table.='<tr>';
$table.='<td>'.$user['id'].'</td>';
$table.='<td>'.$user['uname'].'</td>';
$table.='<td>'.$user['gender'].'</td>';
$table.='</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:lightblue;}
td,th {border: 1px solid; padding:5px}
</style>';
// require 'Model.php';
// $data = (new Model)->getData();
// echo (new View)->fetch($data);
控制器层
<?php
namespace mvc_demo;
//中间桥梁 控制器
require 'Model.php';
require 'View.php';
// class Controller
// {
// //将依赖的外部对象 在操作方法中注入
// public function index(Model $model,View $view){
// // 1.获取数据
// $data = $model->getData();
// //2. 模板渲染
// return $view->fetch($data);
// }
// public function edit(Model $model){
// }
// }
class Controller {
protected $model;
protected $view;
//通过构造方法将外部对象初始化,实现了外部依赖注入的对象在类内部的共享/复用
public function __construct(Model $model, View $view)
{
$this->model = $model;
$this->view = $view;
}
public function index(Model $model,View $view){
// 1.获取数据
$data = $this->model->getData();
//2. 模板渲染
return $this->view->fetch($data);
}
public function edit()
{
$this->model->editData();
}
}
//客户端
$model = new Model();
$view = new View();
$ctrl = new Controller($model,$view);
// ECHO $ctrl->index($model,$view);
echo call_user_func_array([$ctrl,'index'],[$model,$view]);