设计模式之适配器模式(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");
设计模式之适配器模式(php实现)的更多相关文章
- 每天一个设计模式-3 适配器模式(Adapteer)
每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...
- Head First 设计模式之适配器模式与外观模式
Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...
- C#设计模式(7)——适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)
1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- C#设计模式之七适配器模式(Adapter)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...
- 8.3 GOF设计模式二: 适配器模式 Adapter
GOF设计模式二: 适配器模式 Adapter 为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式 SingleTon的三个关键点 ...
- C#设计模式之六适配器模式(Adapter Pattern)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...
- C#设计模式(7)——适配器模式(Adapter Pattern)(转)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
随机推荐
- 【转载】10个最佳ES6特性
译者按: 人生苦短,我用ES6. 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 译者: Fundebug 为了保证 ...
- 点对点协议(Point-to-Point Protocol)
简介 点对点协议简称PPP协议,工作在数据链路层.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机. 网桥和路由器之间简单连接的一种共通的解决方案. PPP协议的组成 建立 ...
- 情报传递(message)
情报传递(message) 题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络,情报网络中共有n名情报员.每名情报员可能有若干名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名 ...
- BZOJ[Sdoi2014]数表 莫比乌斯反演
[Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2383 Solved: 1229[Submit][Status][Disc ...
- display 垂直居中
/* Center slide text vertically */ display: -webkit-box; display: -ms-flexbox; display: -webkit-flex ...
- myeclipse maven web项目配置
启用maven:window-->preference-->MyEclipse-->Maven4MyEclipse, 勾选复选框(Enable Mave4MyEclipse feat ...
- Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731
生日蛋糕 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...
- gdb 查看变量~p长串末尾省略号, 一个页面显示不完
# MQClientAPIImpl::getTopicRouteInfoFromNameServer () at MQClientAPIImpl.cpp: # # # # # # # # # , ar ...
- V4或者V7包重复冲突,但是不知道删除那个的问题
加这行代码在dependencies统一级别 configurations { all*.exclude group: 'com.android.support', module: 'support- ...
- Python 如何调用 Java
引用了这个文章,请打开链接 http://www.cnblogs.com/junrong624/p/5278457.html 日后待补写 ...