PHP中用接口、抽象類、普通基類實(shí)現(xiàn)“面向接口編程”與“耦合方法”簡(jiǎn)述
更新時(shí)間:2011年03月23日 22:27:24 作者:
邊學(xué)邊做的,為方便自己翻閱而發(fā)布,更為得到高人指點(diǎn)而發(fā)布,歡迎高手指點(diǎn)
復(fù)制代碼 代碼如下:
<?php
/*
邊學(xué)邊做的,為方便自己翻閱而發(fā)布,更為得到高人指點(diǎn)而發(fā)布,歡迎高手指點(diǎn)......
【提示】本例通過測(cè)試無誤
【情景設(shè)計(jì)】
模擬計(jì)算機(jī)主板IDE接口,比如:主板可以存取的儲(chǔ)存器常常有光驅(qū)、硬盤、閃存等等,
為了方便,有必要對(duì)這些不同的儲(chǔ)存器設(shè)定同一的接口。
本例還假設(shè)一種前所未有的、存取方式與眾不同的外星儲(chǔ)存器也要加到主板上進(jìn)行存取,
于是需要采用耦合的設(shè)計(jì)模式。
【本例主要講述】
1、通過接口、抽象類、一般類繼承三種方式達(dá)到所謂的“接口”模式,以此說明:
A、子類對(duì)象可以當(dāng)父類對(duì)象用,因?yàn)樽宇愂翘厥獾母割?#65279;!
B、請(qǐng)注意這三種實(shí)現(xiàn)方式中接口、抽象類和一般類繼承的基類寫法!
2、接口模式真的是一紙契約!
3、程序設(shè)計(jì)之"耦合設(shè)計(jì)模式"!
*/
//----------------------------------------------------------------------
/*【方式一】接口實(shí)現(xiàn)方式:*/
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 "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
class yingpan implements readandwrite{
function __construct(){
echo "我是硬盤:<br>";
}
function read(){
echo "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
class disco implements readandwrite{
function __construct(){
echo "我是光盤:<br>";
}
function read(){
echo "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
//----------------------------------------------------------------------
/*【方式二】抽象類實(shí)現(xiàn)方式:
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 "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
class yingpan extends readandwrite{
function __construct(){
echo "我是硬盤:<br>";
}
function read(){
echo "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
class disco extends readandwrite{
function __construct(){
echo "我是光盤:<br>";
}
function read(){
echo "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
*/
//----------------------------------------------------------------------
//【方式三】一般類繼承實(shí)現(xiàn)方式:
/*
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 "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
class yingpan extends readandwrite{
function __construct(){
echo "我是硬盤:<br>";
}
function read(){
echo "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
class disco extends readandwrite{
function __construct(){
echo "我是光盤:<br>";
}
function read(){
echo "開始讀取數(shù)據(jù)......<br>";
}
function write(){
echo "開始儲(chǔ)存數(shù)據(jù)......<hr>";
}
}
*/
//----------------------------------------------------------------------
/*
【耦合模式】
耦合模式就是將不同標(biāo)準(zhǔn)的兩個(gè)類(本例的接口、抽象類、普通基類與外星儲(chǔ)存器有不同的存取方法),
通過中間轉(zhuǎn)換器,達(dá)到同一標(biāo)準(zhǔn)的目的,就像轉(zhuǎn)接線一樣——本例就是將unknow類的Rdata、Wdata方法轉(zhuǎn)
換成read、write方法,達(dá)到和本例的接口、抽象類、普通基類相同的存取方法, 本例的中間轉(zhuǎn)換器是
Apdater類。
由于php中只能繼承一個(gè)類但可以繼承多個(gè)接口,所以產(chǎn)生了三種耦合方法:
方法一:中間轉(zhuǎn)換器Apdater類繼承抽象類或普通基類,但由于php中只能繼承一個(gè)類,所以在Apdater
類中定義一個(gè)外星存儲(chǔ)器類unknow的對(duì)象,并用重載繼承的抽象類或普通基類的存取方法的方式來轉(zhuǎn)
換存取方法,達(dá)到同一存取方法的目的。
方法二:中間轉(zhuǎn)換器Apdater類繼承外星存儲(chǔ)器類unknow、接口,此時(shí)可以直接用Apdater類的存取方法
(parent::Rdata()與parent::Wdata()——php中子類調(diào)用父類方法的方式),和實(shí)現(xiàn)接口規(guī)定方法,
來轉(zhuǎn)換存取方法,達(dá)到同一存取方法的目的。
方法三:與方法一雷同,只是改為繼承(實(shí)現(xiàn))接口;
*/
//----------------------------------------------------------------------
/*
【方法一】
*/
/*
class unknow{
function __construct(){
echo "<font color=#ff0000>我是地球人未知的外星儲(chǔ)存器,我有不同于地球儲(chǔ)存器的存取方式:</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>我是地球人未知的外星儲(chǔ)存器,我有不同于地球儲(chǔ)存器的存取方式:</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>我是地球人未知的外星儲(chǔ)存器,我有不同于地球儲(chǔ)存器的存取方式:</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();
}
}
//【程序主體調(diào)用】
echo "<strong><font color=#990000 size=20px>面向?qū)ο蟪绦蛟O(shè)計(jì)——接口</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 接口類與抽象類的實(shí)際作用
- php接口和抽象類使用示例詳解
- 深入分析php中接口與抽象類的區(qū)別
- PHP中抽象類、接口的區(qū)別與選擇分析
- PHP OPP機(jī)制和模式簡(jiǎn)介(抽象類、接口和契約式編程)
- PHP入門教程之面向?qū)ο蟮奶匦苑治?繼承,多態(tài),接口,抽象類,抽象方法等)
- 淺析php中抽象類和接口的概念以及區(qū)別
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)高級(jí)特性詳解(接口,繼承,抽象類,析構(gòu),克隆等)
- PHP抽象類與接口的區(qū)別詳解
- PHP中抽象類,接口功能、定義方法示例
- php抽象類和接口知識(shí)點(diǎn)整理總結(jié)
相關(guān)文章
詳談php ip2long 出現(xiàn)負(fù)數(shù)的原因及解決方法
下面小編就為大家?guī)硪黄斦刾hp ip2long 出現(xiàn)負(fù)數(shù)的原因及解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
個(gè)人站長(zhǎng)制做網(wǎng)頁常用的php代碼
個(gè)人站長(zhǎng)制做網(wǎng)頁常用的php代碼...2007-03-03
數(shù)據(jù)結(jié)構(gòu)之利用PHP實(shí)現(xiàn)二分搜索樹
這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)之利用PHP實(shí)現(xiàn)二分搜索樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
2020-10-10
php array_map與array_walk比較案例詳解
這篇文章主要介紹了php array_map與array_walk比較案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
2021-09-09 
