您现在的位置是:首页 > 技术博客 > PHP设计模式六大原则之迪米特原则

PHP设计模式六大原则之迪米特原则

2021-08-10文远技术博客373373

PHP

1、什么是迪米特原则

一个类对自己依赖的类知道的越少越好,如果一个类需要调用另一个类,可以通过第三方去转发这个调用,避免在当前类去实例化另一个类


2、代码示例

/**
 * 关机类
 */
class close
{
    public function run()
    {
        $this->request();
        $this->start();
        $this->closeApp();
        $this->end();
    }
    private function request()
    {
        fwrite(STDOUT,'还有应用程序在运行,是否仍要关机:');
        $argv = fgets(STDIN);
        if (strncasecmp($argv,'no',2) == 0)
        {
            $this->exitClose();
            exit();
        }
    }

    private function start()
    {
        echo "开始关机",PHP_EOL;
    }

    private function closeApp()
    {
        echo "正在关闭启动的应用程序",$this->str(),PHP_EOL;
    }

    private function end()
    {
        echo "关机完成",PHP_EOL;
    }

    private function str()
    {
        for ($i=0;$i<3;$i++){
            sleep(1);
            echo '.';
        }
    }

    private function exitClose()
    {
        echo "已取消关机";
    }
}


/**
 * 播放音乐类
 */
class music
{
    private $music;

    public function run()
    {
        $this->request();
        $this->select();
        $this->start();
    }

    private function request()
    {
        fwrite(STDOUT,'请点歌:');
        $this->music = fgets(STDIN);
    }

    private function select()
    {
        echo "正在搜索歌曲:".$this->music.$this->str().PHP_EOL;
    }

    private function start()
    {
        echo "开始播放歌曲:".$this->music.PHP_EOL;
    }

    private function str()
    {
        for ($i=0;$i<3;$i++){
            sleep(1);
            echo '.';
        }
    }
}


/**
 * 开机类
 */
class start
{
    private $UserName = "starsky";

    private $Password = "starsky99";

    public function run()
    {
        $this->begin();
        $this->init();
        $this->loader();
        $this->end();
    }

    private function begin()
    {
        echo "欢迎使用".PHP_EOL;
    }

    private function init()
    {
        echo "正在初始化系统,请稍后".PHP_EOL;
    }

    private function loader()
    {
        echo "正在加载系统应用".PHP_EOL;
    }

    private function end()
    {
        fwrite(STDOUT,"系统加载完毕,请输入用户名:");
        $username = fgets(STDIN);
        fwrite(STDOUT,"请输入密码:");
        $password = fgets(STDIN);
        $this->check($username,$password);
        echo "登录成功".PHP_EOL;
    }

    private function check($username,$password)
    {
        $restful = true;
        while ($restful){
            if (strncasecmp($username,$this->UserName,strlen($username)) == 0 && strncasecmp($password,$this->Password,strlen($password))==0){
                break;
            }else{
                echo "用户名或密码错误,请重试",PHP_EOL;
                fwrite(STDOUT,"请输入用户名:");
                $username = fgets(STDIN);
                fwrite(STDOUT,"请输入密码:");
                $password = fgets(STDIN);
            }
        }
        return true;
    }
}


/**
 * 电脑类
 */
class computer
{
    public function close()
    {
        $close = new close();
        $close->run();
    }

    public function muisc()
    {
        $music = new music();
        $music->run();
    }

    public function start()
    {
        $start = new start();
        $start->run();
    }
}


/**
 * 客户端运行
 */
class client
{
    public function run()
    {
        $computer = new computer();
        $computer->start();
    }
}

$client = new client();
$client->run();

我们实现了关机类、播放音乐类、开机类,现在我们实现一个功能,就是开机->播放音乐->关机。

我们不可以在开机类里面直接new 播放音乐类和new 关机类,所以我们需要一个电脑类来实现转发
这样,开机类不知道播放音乐类的存在,播放音乐类也不知道开机类的存在,但是电脑类知道需要先开机才能播放音乐。

3、优点

1、减少类与类之间的依赖
2、提高代码的复用性


4、缺点

过度使用会产生大量的中介类和传递类,导致系统复杂度变大

文章评论

看完文章了吗?谁便说点吧

发表 captcha

暂无评论