• facade门面
    外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
    作用:
    1、它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便
    2、实现了子系统与客户之间的松耦合关系
    3、如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择
  • 容器与依赖注入
    当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部。
  • MVC架构
    m:model模型层
    v:view视图层
    c:controller控制器层

model层

  1. <?php
  2. namespace mvc_demo;
  3. use PDO;
  4. class Model
  5. {
  6. //获取数据
  7. public function getData()
  8. {
  9. 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);
  10. }
  11. }
  12. // print_r((new Model)->getData());

视图层

  1. <?php
  2. namespace mvc_demo;
  3. class View {
  4. public function fetch($data)
  5. {
  6. $table = '<table>';
  7. $table.='<caption>用户信息表</caption>';
  8. $table.= '<tr><th>编号</th><th>姓名</th><th>性别</th></tr>';
  9. foreach($data as $user)
  10. {
  11. $user['gender'] = $user['gender'] == 1 ?'男' : '女';
  12. $table.='<tr>';
  13. $table.='<td>'.$user['id'].'</td>';
  14. $table.='<td>'.$user['uname'].'</td>';
  15. $table.='<td>'.$user['gender'].'</td>';
  16. $table.='</tr>';
  17. }
  18. $table .= '</table>';
  19. return $table;
  20. }
  21. }
  22. echo '<style>
  23. table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
  24. caption {font-size: 1.2rem; margin-bottom: 10px;}
  25. tr:first-of-type { background-color:lightblue;}
  26. td,th {border: 1px solid; padding:5px}
  27. </style>';
  28. // require 'Model.php';
  29. // $data = (new Model)->getData();
  30. // echo (new View)->fetch($data);

控制器层

  1. <?php
  2. namespace mvc_demo;
  3. //中间桥梁 控制器
  4. require 'Model.php';
  5. require 'View.php';
  6. // class Controller
  7. // {
  8. // //将依赖的外部对象 在操作方法中注入
  9. // public function index(Model $model,View $view){
  10. // // 1.获取数据
  11. // $data = $model->getData();
  12. // //2. 模板渲染
  13. // return $view->fetch($data);
  14. // }
  15. // public function edit(Model $model){
  16. // }
  17. // }
  18. class Controller {
  19. protected $model;
  20. protected $view;
  21. //通过构造方法将外部对象初始化,实现了外部依赖注入的对象在类内部的共享/复用
  22. public function __construct(Model $model, View $view)
  23. {
  24. $this->model = $model;
  25. $this->view = $view;
  26. }
  27. public function index(Model $model,View $view){
  28. // 1.获取数据
  29. $data = $this->model->getData();
  30. //2. 模板渲染
  31. return $this->view->fetch($data);
  32. }
  33. public function edit()
  34. {
  35. $this->model->editData();
  36. }
  37. }
  38. //客户端
  39. $model = new Model();
  40. $view = new View();
  41. $ctrl = new Controller($model,$view);
  42. // ECHO $ctrl->index($model,$view);
  43. echo call_user_func_array([$ctrl,'index'],[$model,$view]);

更多相关文章

  1. <JVM上篇:内存与垃圾回收篇>02-类加载子系统
  2. 12.外观模式
  3. 入门面向对象,第一个实例!
  4. 仅需一步!直接在 Windows 下使用 Linux
  5. 第16章 0303-门面模式与Composer,(composer中自动加载的实现)
  6. android input子系统之-常用命令及技巧
  7. 高通msm8994启动流程简介
  8. input subsystem
  9. Android系统开篇

随机推荐

  1. Android 清除默认launcher 改为其他的lau
  2. 3G调试笔记之发送AT命令和APN配置
  3. Android studio attribute android:fillC
  4. sadasd
  5. API 23 inputmethodservice.KeyboardView
  6. Android:Android(安卓)Studio配置Kotlin
  7. Form表单组合控件
  8. Android - gravity and layout_gravity
  9. Android N画中画模式
  10. Android中AIDL实现进程通信(附源码下载)