设计模式之适配器模式(php实现)
/*
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");