/*
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. [UOJ#348][WC2018]州区划分

    [UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...

  2. 堆栈(Stacks)

    堆栈(Stacks) 准备工作 安装Docker 1.13及以上版本 安装Docker Compose正如第三部分的准备工作. 安装Docker Machine正如第四部分的准备工作. 阅读第一部分的 ...

  3. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  4. java实现短连接

    现在比较流行短连接,例如新浪微博,腾讯等等公司都开始使用短连接. ① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符: ② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串 ...

  5. 《c程序设计语言》读书笔记-4.1-判断字符串在另一个字符串中的位置

    #include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  6. nginx支持pathinfo

    server { root /webserver/www/api; listen ; server_name api.dnxia.com; location / { if (!-e $request_ ...

  7. hdu 1465 不容易系列之一(错排模板)

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. C# 使用文件流来读写ini文件

    背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI封装的help类,用起来倒也顺手. ...

  9. [LA_3938]最大连续动态和

    Sample Input 3 1 1 2 3 1 1 Sample Output Case 1: 1 1 线段树 L,R表示该区间的左右端点,sum表示该区间值的总和 l,r表示该区间连续的最大和的左 ...

  10. MVC如何在路由器(RouteConfig)定义后缀.html

    一.配置文件web.config添加一下设置 <system.webServer> <modules runAllManagedModulesForAllRequests=" ...