PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述


Posted in PHP onMarch 23, 2011
<?php 
/* 
边学边做的,为方便自己翻阅而发布,更为得到高人指点而发布,欢迎高手指点...... 
【提示】本例通过测试无误 
【情景设计】 
模拟计算机主板IDE接口,比如:主板可以存取的储存器常常有光驱、硬盘、闪存等等, 
为了方便,有必要对这些不同的储存器设定同一的接口。 
本例还假设一种前所未有的、存取方式与众不同的外星储存器也要加到主板上进行存取, 
于是需要采用耦合的设计模式。 
【本例主要讲述】 
1、通过接口、抽象类、一般类继承三种方式达到所谓的“接口”模式,以此说明: 
A、子类对象可以当父类对象用,因为子类是特殊的父类! 
B、请注意这三种实现方式中接口、抽象类和一般类继承的基类写法! 
2、接口模式真的是一纸契约! 
3、程序设计之"耦合设计模式"! 
*/ 
//---------------------------------------------------------------------- 
/*【方式一】接口实现方式:*/ 
interface readandwrite{ 
function read(); 
function write(); 
} 
class motherboard{ 
private $storage; 
function __construct(readandwrite $obj){ 
$this->storage=$obj; 
} 
function read(){ 
$this->storage->read(); 
} 
function write(){ 
$this->storage->write(); 
} 
} 
class flash implements readandwrite{ 
function __construct(){ 
echo "我是闪存:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
class yingpan implements readandwrite{ 
function __construct(){ 
echo "我是硬盘:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
class disco implements readandwrite{ 
function __construct(){ 
echo "我是光盘:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
//---------------------------------------------------------------------- 
/*【方式二】抽象类实现方式: 
abstract class readandwrite{ 
abstract function read(); 
abstract function write(); 
} 
class motherboard{ 
private $storage; 
function __construct(readandwrite $obj){ 
$this->storage=$obj; 
} 
function read(){ 
$this->storage->read(); 
} 
function write(){ 
$this->storage->write(); 
} 
} 
class flash extends readandwrite{ 
function __construct(){ 
echo "我是闪存:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
class yingpan extends readandwrite{ 
function __construct(){ 
echo "我是硬盘:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
class disco extends readandwrite{ 
function __construct(){ 
echo "我是光盘:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
*/ 
//---------------------------------------------------------------------- 
//【方式三】一般类继承实现方式: 
/* 
class readandwrite{ 
function read(){ 
echo "reading.............."; 
} 
function write(){ 
echo "writing.............."; 
} 
} 
class motherboard{ 
private $storage; 
function __construct(readandwrite $obj){ 
$this->storage=$obj; 
} 
function read(){ 
$this->storage->read(); 
} 
function write(){ 
$this->storage->write(); 
} 
} 
class flash extends readandwrite{ 
function __construct(){ 
echo "我是闪存:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
class yingpan extends readandwrite{ 
function __construct(){ 
echo "我是硬盘:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
class disco extends readandwrite{ 
function __construct(){ 
echo "我是光盘:<br>"; 
} 
function read(){ 
echo "开始读取数据......<br>"; 
} 
function write(){ 
echo "开始储存数据......<hr>"; 
} 
} 
*/ 
//---------------------------------------------------------------------- 
/* 
【耦合模式】 
耦合模式就是将不同标准的两个类(本例的接口、抽象类、普通基类与外星储存器有不同的存取方法), 
通过中间转换器,达到同一标准的目的,就像转接线一样——本例就是将unknow类的Rdata、Wdata方法转 
换成read、write方法,达到和本例的接口、抽象类、普通基类相同的存取方法, 本例的中间转换器是 
Apdater类。 
由于php中只能继承一个类但可以继承多个接口,所以产生了三种耦合方法: 
方法一:中间转换器Apdater类继承抽象类或普通基类,但由于php中只能继承一个类,所以在Apdater 
类中定义一个外星存储器类unknow的对象,并用重载继承的抽象类或普通基类的存取方法的方式来转 
换存取方法,达到同一存取方法的目的。 
方法二:中间转换器Apdater类继承外星存储器类unknow、接口,此时可以直接用Apdater类的存取方法 
(parent::Rdata()与parent::Wdata()——php中子类调用父类方法的方式),和实现接口规定方法, 
来转换存取方法,达到同一存取方法的目的。 
方法三:与方法一雷同,只是改为继承(实现)接口; 
*/ 
//---------------------------------------------------------------------- 
/* 
【方法一】 
*/ 
/* 
class unknow{ 
function __construct(){ 
echo "<font color=#ff0000>我是地球人未知的外星储存器,我有不同于地球储存器的存取方式:</font><br>"; 
} 
function Rdata(){ 
echo "I'm reading now......<br>"; 
} 
function Wdata(){ 
echo "I'm writing now......<hr>"; 
} 
} 
class Adpater extends readandwrite{ 
private $obj; 
function __construct(unknow $x){ 
$this->obj=$x; 
} 
function read(){ 
$this->obj->Rdata(); 
} 
function write(){ 
$this->obj->Wdata(); 
} 
} 
*/ 
//---------------------------------------------------------------------- 
/* 
【方法二】 
class unknow{ 
function __construct(){ 
echo "<font color=#ff0000>我是地球人未知的外星储存器,我有不同于地球储存器的存取方式:</font><br>"; 
} 
function Rdata(){ 
echo "I'm reading now......<br>"; 
} 
function Wdata(){ 
echo "I'm writing now......<hr>"; 
} 
} 
class Adpater extends unknow implements readandwrite{ 
function read(){ 
parent::Rdata(); 
} 
function write(){ 
parent::Wdata(); 
} 
} 
*/ 
//------------------------------------------------------------------------ 
/* 
【方法三】 
*/ 
class unknow{ 
function __construct(){ 
echo "<font color=#ff0000>我是地球人未知的外星储存器,我有不同于地球储存器的存取方式:</font><br>"; 
} 
function Rdata(){ 
echo "I'm reading now......<br>"; 
} 
function Wdata(){ 
echo "I'm writing now......<hr>"; 
} 
} 
class Adpater implements readandwrite{ 
private $obj; 
function __construct(unknow $x){ 
$this->obj=$x; 
} 
function read(){ 
$this->obj->Rdata(); 
} 
function write(){ 
$this->obj->Wdata(); 
} 
} 
//【程序主体调用】 
echo "<strong><font color=#990000 size=20px>面向对象程序设计——接口</font></strong><hr>"; 
$storage1=new flash(); 
$computer=new motherboard($storage1); 
$computer->read(); 
$computer->write(); 
$storage2=new yingpan(); 
$computer=new motherboard($storage2); 
$computer->read(); 
$computer->write(); 
$storage3=new disco(); 
$computer=new motherboard($storage3); 
$computer->read(); 
$computer->write(); 
$un_storage=new unknow(); 
$apdaterx=new Adpater($un_storage); 
$computer=new motherboard($apdaterx); 
$computer->read(); 
$computer->write(); 
?>
PHP 相关文章推荐
PHP实现单例模式最安全的做法
Jun 13 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
ThinkPHP中使用ajax接收json数据的方法
Dec 18 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
Laravel学习教程之从入口到输出过程详解
Aug 27 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 PHP
php中取得URL的根域名的代码
Mar 23 #PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 #PHP
PHP 事件机制(2)
Mar 23 #PHP
php函数之子字符串替换&amp;#65279; str_replace
Mar 23 #PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 #PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 #PHP
PHPUnit PHP测试框架安装方法
Mar 23 #PHP
You might like
PHP4实际应用经验篇(9)
2006/10/09 PHP
php 中英文语言转换类
2011/09/07 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
javascript 动态创建表格
2015/01/08 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
Python实现获取某天是某个月中的第几周
2015/02/11 Python
浅析python中的分片与截断序列
2016/08/09 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
Django 内置权限扩展案例详解
2019/03/04 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
Python3离线安装Requests模块问题
2019/10/13 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
销售顾问岗位职责
2014/02/25 职场文书
客房服务员岗位职责
2015/02/09 职场文书
军训个人总结
2015/03/03 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
python如何读取和存储dict()与.json格式文件
2022/06/25 Python
python数字图像处理:图像的绘制
2022/06/28 Python