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操作类
Nov 16 PHP
新手学PHP之数据库操作详解及乱码解决!
Jan 02 PHP
附件名前加网站名
Mar 23 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 PHP
twig模板获取全局变量的方法
Feb 05 PHP
php实现多维数组排序的方法示例
Mar 23 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
PHP 实现链式操作
Mar 09 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
使用PHP维护文件系统
2006/10/09 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
在vue中获取dom元素内容的方法
2017/07/10 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
python文件操作整理汇总
2014/10/21 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python 去除字符串中指定字符串
2020/03/05 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
pandas 数据类型转换的实现
2020/12/29 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
中学教师培训制度
2014/01/31 职场文书
学校师德承诺书
2014/05/23 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
公司催款律师函
2015/05/27 职场文书
Python中的程序流程控制语句
2022/02/24 Python