前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Thinkphp5.1中用到的设计模式(依赖注入,容器,Facade门面模式)

Thinkphp5.1中用到的设计模式(依赖注入,容器,Facade门面模式)

作者头像
九霄道长
发布2021-03-02 10:46:15
1.1K0
发布2021-03-02 10:46:15
举报
文章被收录于专栏:九霄道长

原始代码

代码语言:javascript
复制
<?php
//数据库操作

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

//用户

/**
 * Class User
 * 工作类
 */
class User
{
    public function login()
    {
        //链接数据库
        $db = new Db();
        echo $db->init();
        //数据验证
        $validate = new Validate();
        echo $validate->check();
        //视图
        $view = new View();
        echo $view->display();
    }
}

/**
 * 客户端:只要能发起请求的
 * 浏览器,ajax,一段代码
 */
$user = new User();
$user->login();
/*
 * 1.只有user是工作类,db,validate,view是工具类
 * 2.如果工具类发生变化,所有对该类的引用都要进行修改(参数)
 * 3.工作类的调用者必须非常了解用到的工具类
 * 4.工作类对三个工具类:Db,validate,view,形成严重依赖,耦合
 * 粘合度太强。
 *
 * 解决耦合的过程叫解耦 最常用的  依赖注入DI
 *
 */

依赖注入解耦

代码语言:javascript
复制
<?php
//数据库操作

/**
 * 依赖注入实现解耦
 * 1.在工作类中调用的工具类实例化在类外完成
 */

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

//用户

/**
 * Class User
 * 工作类
 */
class User
{
    protected $db=null;
    protected $validate=null;
    protected $view=null;
    //构造器注入
    public function __construct(Db $db,Validate $validate,View $view)
    {
        $this->db=$db;
        $this->validate=$validate;
        $this->view=$view;
    }

    public function login()
    {
        //链接数据库
        echo $this->db->init();
        //数据验证
        echo $this->validate->check();
        //视图

        echo $this->view->display();
    }
}

/**
 * 客户端:只要能发起请求的
 * 浏览器,ajax,一段代码
 */

//类外实例化
$db = new Db();
$validate = new Validate();
$view = new View();


$user = new User($db,$validate,$view);
echo "依赖注册解耦\n";
$user->login();

依赖容器解耦

代码语言:javascript
复制
<?php
/**
 * 容器 container ,服务容器/对象容器/类容器/接口:即插即用
 * 分为三步
 * 1. 创建容器 :将类与类的实例化过程绑定到容器中
 * 2. 服务注册 :将可能用到的工具绑定到容器中
 * 3. 容器依赖 :从依赖对象到依赖一个对象的集合。 直接传入一个容器即可,工具类的实例化由容器完成
 */

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

/**********************************/

//创建容器
class Container
{
    //创建一个数据保存类与类的实例化方法
    public $instance = [];

    public function bind($abstract, Closure $process)
    {
        //键名为类名,值为实例化的方法
        $this->instance[$abstract] = $process;
    }

    //创建类的实例
    public function make($abstract, $process = [])
    {
        return call_user_func_array($this->instance[$abstract],$process);
    }
}

/**********************************/
//服务绑定
$container = new Container();
//db类绑定进去
$container->bind("db", function () {
    return new Db();
});

//validate类绑定进去
$container->bind("validate", function () {
    return new Validate();
});
//view类绑定进去
$container->bind("view", function () {
    return new View();
});
//打印容器
//var_dump($container->instance);

//容器依赖
/**
 * Class User
 * 工作类
 */
class User
{

    public function login(Container $container)
    {
        //链接数据库
        echo $container->make("db")->init();
        //数据验证
        echo $container->make("validate")->check();
        //视图
        echo $container->make("view")->display();
    }
}

$user = new User();
echo "依赖容器实现解耦\n";
$user->login($container);

门面模式

容器类

代码语言:javascript
复制
<?php
/**
 * 容器 container ,服务容器/对象容器/类容器/接口:即插即用
 * 分为三步
 * 1. 创建容器 :将类与类的实例化过程绑定到容器中
 * 2. 服务注册 :将可能用到的工具绑定到容器中
 * 3. 容器依赖 :从依赖对象到依赖一个对象的集合。 直接传入一个容器即可,工具类的实例化由容器完成
 */

/**
 * Class Db
 * 辅助类
 */
class Db
{
    //数据库链接
    public function init()
    {
        return "数据库链接成功\n";
    }
}

//数据验证

/**
 * Class Validate
 * 辅助类
 */
class Validate
{
    public function check()
    {
        return "验证成功\n";
    }
}

//视图

/**
 * Class View
 * 辅助类
 */
class View
{
    public function display()
    {
        return "用户登陆成功\n";
    }
}

/**********************************/

//创建容器
class Container
{
    //创建一个数据保存类与类的实例化方法
    public $instance = [];

    public function bind($abstract, Closure $process)
    {
        //键名为类名,值为实例化的方法
        $this->instance[$abstract] = $process;
    }

    //创建类的实例
    public function make($abstract, $process = [])
    {
        return call_user_func_array($this->instance[$abstract],$process);
    }
}

/**********************************/
//服务绑定
$container = new Container();
//db类绑定进去
$container->bind("db", function () {
    return new Db();
});

//validate类绑定进去
$container->bind("validate", function () {
    return new Validate();
});
//view类绑定进去
$container->bind("view", function () {
    return new View();
});

门面实现

代码语言:javascript
复制
<?php
/**
 * Facade 外观模式 门面模式
 * 1.对操作进行封装,对外提供统一接口
 * 2.必须要结合容器,才能实现
 */
require "Container.php";

//创建门面模式
class Facade
{
    //链接数据库
    public static function init(Container $container){
        return $container->make("db")->init();
    }
    //验证数据
    public static function check(Container $container){
        return $container->make("validate")->check();
    }
    //视图
    public static function display(Container $container){
        return $container->make("view")->display();
    }
}
//客户端调用
echo "门面模式\n";
echo Facade::init($container);
echo Facade::check($container);
echo Facade::display($container);

版权属于:尹深

本文链接:https://cloud.tencent.com/developer/article/1795111

转载时须注明出处及本声明

(本站部分资源来自互联网收集整理!如有侵权请联系站长删除!!!)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 08 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原始代码
  • 依赖注入解耦
  • 依赖容器解耦
  • 门面模式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档