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 相关文章推荐
基于MySQL分区性能的详细介绍
May 02 PHP
php强制运行广告的方法
Dec 01 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
PHP信号量基本用法实例详解
Feb 12 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
PHP静态成员变量
Feb 14 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
PHP遍历数组的6种方式总结
Nov 17 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
模拟flock实现文件锁定
2007/02/14 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
Jquery 扩展方法
2010/05/06 Javascript
js word表格动态添加代码
2010/06/07 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
Django实现分页功能
2018/07/02 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python基于event实现线程间通信控制
2020/01/13 Python
python爬虫容易学吗
2020/06/02 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
《故乡》教学反思
2014/04/10 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
小学教师读书笔记
2015/07/01 职场文书
亲情作文之母爱
2019/09/25 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书