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&amp;mysql(二)
Oct 09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
js代码实现微博导航栏
Jul 30 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
CI框架实现创建自定义类库的方法
Dec 25 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
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
python实现360的字符显示界面
2014/02/21 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python中的引用知识点总结
2019/05/20 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
学生学习总结的自我评价
2013/10/22 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
教职工代表大会主持词
2014/04/01 职场文书
股份合作协议书
2014/04/12 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
Python经常使用的一些内置函数
2022/04/11 Python