PHP中用介面、抽象類別、普通基類實現“面向介面編程”與“耦合方法”簡述

來源:互聯網
上載者:User

複製代碼 代碼如下:<?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();
?>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.