设计模式之适配器模式(php实现)
2024-08-27 05:48:38
/*
github地址:https://github.com/ZQCard/design_pattern
* 适配器模式:将一个类的接口转换成客户希望的另外一个接口。
* 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
*
* 实例解析:
* 我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。
* 默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
* 我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。
* 该类可以播放 vlc 和 mp4 格式的文件。我们想要让 AudioPlayer 播放其他格式的音频文件。
* 为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类MediaAdapter,
* 并使用 AdvancedMediaPlayer 对象来播放所需的格式。AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,
* 不需要知道能播放所需格式音频的实际类。adapter.php,我们的演示类使用 AudioPlayer 类来播放各种格式。
* 优点:
* 1、可以让任何两个没有关联的类一起运行。
* 2、提高了类的复用。
* 3、增加了类的透明度。
* 4、灵活性好。 * 缺点:
* 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。
* 比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。
* 因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
*/
(1)MediaPlayer.class.php(初始播放类接口)
<?php
namespace Adapter; interface MediaPlayer
{
public function play($audioType, $fileName);
}
(2)AdvancedMediaPlayer(高级播放类接口)
<?php
namespace Adapter; interface AdvancedMediaPlayer
{
public function playVlc($fileName);
public function playMp4($fileName);
}
(3)MediaAdapter.class.php(播放器适配器)
<?php namespace Adapter; class MediaAdapter implements MediaPlayer
{
private $media; public function __construct($audioType)
{
switch ($audioType){
case 'vlc':
$this->media = new VlcPlayer();
break;
case 'mp4':
$this->media = new Mp4Player();
break;
default:
var_dump("没有".$audioType."文件格式");
echo '<br/>';
}
} public function play($audioType, $fileName)
{
switch ($audioType){
case 'vlc':
$this->media->playVlc($fileName);
break;
case 'mp4':
$this->media->playMp4($fileName);
break;
default:
var_dump("没有".$audioType."文件格式");
echo '<br/>';
}
}
}
(4)Mp4Player.class.php(MP4播放器)
<?php namespace Adapter; class Mp4Player implements AdvancedMediaPlayer
{
public function playVlc($fileName)
{ } public function playMp4($fileName)
{
var_dump("播放MP4格式的文件".$fileName);
echo '<br/>';
}
}
(5)VlcPlayer.class.php
<?php namespace Adapter; class VlcPlayer implements AdvancedMediaPlayer
{
public function playVlc($fileName)
{
var_dump("播放vlc格式的文件".$fileName);
echo '<br/>';
} public function playMp4($fileName)
{ }
}
(6)AudioPlater.class.php
<?php namespace Adapter; class AudioPlayer implements MediaPlayer
{
public function play($audioType, $fileName)
{
if ($audioType == 'mp3'){
var_dump("播放mp3格式的文件".$fileName);
echo '<br/>'; }elseif ($audioType=='vlc' || $audioType=='mp4'){
$media = new MediaAdapter($audioType);
$media->play($audioType,$fileName);
}else{
var_dump("非法格式的文件".$fileName);
echo '<br/>';
}
}
}
(7)adapter.php(客户端)
<?php spl_autoload_register(function ($classObj){
$classObj = str_replace('\\','/',$classObj);
include $classObj.".class.php";
}); use \Adapter\AudioPlayer;
$media = new AudioPlayer(); $media->play("mp3", "beyond the horizon.mp3");
$media->play("mp4", "alone.mp4");
$media->play("vlc", "far far away.vlc");
$media->play("avi", "mind me.avi");
最新文章
- Xcode7建立自己的自定义工程和类模板
- spark单机环境下运行一些解决问题
- HAProxy 实践(一)
- Linux zip/unzip命令
- oracle 查询当前库中所有表以及某表字段信息
- fleetctl --help
- Navicat数据存放位置和备份数据库路径设置
- CAF(C++ actor framework)使用随笔(延迟发送,消息转发,消息优先级)(四)
- 使用JDBC进行数据库的事务操作(1)
- bayboy下载安装
- PBOC圈存时用到3DES加密解密以及MAC计算方法
- junit源码解析--测试驱动运行阶段
- Python3.7 dataclass 介绍
- Express学习(1) ------Express 入门
- Linux 上pcntl安装步骤
- Microsoft JET Database Engine 错误 &#39;80004005&#39; 未指定错误
- 阿里云centos远程连接mysql
- 第一个dubbo程序
- 买铅笔(NOIP2016)
- Legendre多项式