PHP设计模式六大原则之迪米特原则
2021-08-10文远技术博客373373
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、缺点
过度使用会产生大量的中介类和传递类,导致系统复杂度变大相关文章
文章评论
看完文章了吗?谁便说点吧
发表
暂无评论