/*
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. nodejs & docker

    nodejs & docker https://github.com/xgqfrms-GitHub/Node.js/blob/master/Docker-Nodejs/translation. ...

  2. hdu 3499 Flight (最短路径)

    Flight Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Su ...

  3. WebRTC 视频对话

    今天聊一下WebRTC.很多开发者,可能会觉得有些陌生,或者直接感觉繁杂.因为WebRTC在iOS上的应用,只是编译都让人很是头痛.这些话,到此为止,以防让了解者失去信心.我们只传播正能量,再多的困难 ...

  4. (poj)Sequence Median

    Description Given a sequence of N nonnegative integers. Let's define the median of such sequence. If ...

  5. bzoj 4897 天赋 有向图的矩阵数定理

    4894: 天赋 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 104  Solved: 80[Submit][Status][Discuss] De ...

  6. MFC中使用sqlite3操作数据库

    需要用到的文件有sqlite3.h .sqlite3.dll.sqlite3.lib.网上很多人分享下载地址这里不再赘述. 将这三个文件拷贝到自己新建MFC项目目录下,在解决方案窗口下 添加现有项,选 ...

  7. Laravel5.1忽略Csrf验证的方法

    在/App/Http/middleware/VerifyCsrfToken.php 文件的protected $except里面加入路由地址

  8. FTP-Filezilla首次配置

    最新新弄了个服务器,先吐槽下,之前买镜像都是免费的,昨天试了,竟然收费.... 好吧,用户多了也正常. 代码发布之前都是很暴力的直接远程桌面然后粘贴,有个合作伙伴突然需要FTP,说之前用的就是,我就做 ...

  9. 在MSSQL中将数字转换成中文

    具体代码如下: CREATE FUNCTION [dbo].[fn_NumberToChinese] (@number INT) ) AS BEGIN ); ); ); SET @res = ''; ...

  10. Linux下多进程服务端客户端模型二(粘包问题与一种解决方法)

    一.Linux发送网络消息的过程 (1) 应用程序调用write()将消息发送到内核中 ( 2)内核中的缓存达到了固定长度数据后,一般是SO_SNDBUF,将发送到TCP协议层 (3)IP层从TCP层 ...