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 程序员的调试技术小结
Nov 15 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
php使用google地图应用实例
Dec 31 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
用PHP代码给图片加水印
Jul 01 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
yii2的restful api路由实例详解
May 14 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 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
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
11款基于Javascript的文件管理器
2009/10/25 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
JS中操作JSON总结
2020/12/06 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python os模块介绍
2014/11/30 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
一百多行python代码实现抢票助手
2018/09/25 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Python中字符串List按照长度排序
2019/07/01 Python
Django后台admin的使用详解
2019/07/08 Python
Python csv模块使用方法代码实例
2019/08/29 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
纬创Java面试题笔试题
2014/10/02 面试题
关于环保的演讲稿
2014/05/10 职场文书
体育节口号
2014/06/19 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
原生JS实现分页
2022/04/19 Javascript