/*
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");

设计模式之适配器模式(php实现)的更多相关文章

  1. 每天一个设计模式-3 适配器模式(Adapteer)

    每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...

  2. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

  3. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  4. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

  5. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  6. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  7. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

  8. C#设计模式之六适配器模式(Adapter Pattern)【结构型】

    一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...

  9. C#设计模式(7)——适配器模式(Adapter Pattern)(转)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  10. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

随机推荐

  1. 【C++ 拾遗】C++'s most vexing parse

    C++'s most vexing parse 是 Scott Meyers 在其名著<Effective STL>中创造的一个术语. Scott 用这个术语来形容 C++ 标准对于 de ...

  2. 【NOI 2015网络同步赛】

    今年没法去.. 分数160+181+100(假设我有去考笔试)=441 分数线:金548 银459 铜331 并没有到银牌线.... 以后题目啊数据啊出来的话继续更新 2015.7.19

  3. [ARC083F] Collecting Balls [建二分图+环套树定向+建拓扑图+树的拓扑序计数]

    题面 [传送门](https://arc083.contest.atcoder.jp/tasks/arc083_d) 思路 这是一道真正的好题 第一步:转化模型 行列支配类的问题,常见做法就是把行和列 ...

  4. 【POJ 2976 Dropping tests】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 13849Accepted: 4851 Description In a certa ...

  5. url为什么要编码及php中的中文字符urlencode基本原理

    首先了解以下中文字符在使用urlencode的时候运用的基本原理: urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%. 此字符串中除了 -_. 之外的所 ...

  6. redux-saga call 和 fork的区别

    call 为阻塞调用, fork为非阻塞调用

  7. template.js 模板引擎

    例子: html代码: <div id="box"></div> css代码: table{ border-collapse: collapse; text ...

  8. HDU 1171Big Event in HDU(转01背包)

    题意: 给你一组数,分成差距最小的两份A,B(A>=B) 分析: 转01背包 注意: 01背包用一维数组 不要用二维 二维数组若是开太大,内存超限,开太小,RE #include "c ...

  9. Ubuntu系统用户与用户组

    1.查看用户组 vi /etc/group 结果说明: 组名: 组名是用户组的名称,由字母或数字构成.与/etc/passwd中的登录名一样,组名不应重复.   口令: 口令字段存放的是用户组加密后的 ...

  10. 设置小于12px的字体

    .small-font{   font-size:12px;             -webkit-transform-origin-x: 0;            -webkit-transfo ...