PHP面向物件之旅:一個介面例項,很好的例子
阿新 • • 發佈:2019-01-10
我們設計一個線上銷售系統,使用者部分設計如下:
將使用者分為,NormalUser, VipUser, InnerUser三種。
要求根據使用者的不同折扣計算使用者購買產品的價格。
並要求為以後擴充套件和維護預留空間。
使用者部分先聲明瞭一個介面User,使用者都是User的實現。
User.php
01 |
<? |
02 |
/* |
03 |
* 定義了 User介面. |
04 |
* 和子類 NormalUser,VipUser,InnerUser
|
05 |
*/ |
06 |
//User介面,定義了三個抽象方法. |
07 |
interface User{ |
08 |
public function
getName(); |
09 |
public function
setName( $_name ); |
10 |
public function
getDiscount(); |
11 |
} |
12 |
abstract class AbstractUser
implements User{ |
13 |
private $name
= "" ; //名字 |
14 |
protected $discount
= 0; //折扣 |
15 |
protected $grade
= "" ; //級別 |
16 |
17 |
public function
__construct( $_name ){ |
18 |
$this ->setName( $_name ); |
19 |
} |
20 |
public function
getName(){ |
21 |
return $this ->name; |
22 |
} |
23 |
public function
setName( $_name ){ |
24 |
$this ->name = $_name ; |
25 |
} |
26 |
public function
getDiscount(){ |
27 |
return $this ->discount; |
28 |
} |
29 |
30 |
public function
getGrade(){ |
31 |
return $this ->grade; |
32 |
} |
33 |
} |
34 |
class NormalUser extends
AbstractUser { |
35 |
protected $discount
= 1.0; |
36 |
protected $grade
= "NormalUser" ; |
37 |
} |
38 |
class VipUser extends
AbstractUser { |
39 |
protected $discount
= 0.8; |
40 |
protected $grade
= "VipUser" ; |
41 |
} |
42 |
class InnerUser extends
AbstractUser { |
43 |
protected $discount
= 0.7; |
44 |
protected $grade
= "InnerUser" ; |
45 |
} |
46 |
?> |
關於產品,我們進行了如下設計。
宣告一個介面Product,然後從Product繼承下Book介面。
線上銷售的圖書最後是實現了Book介面的BookOnline類。
Product.php
01 |
<? |
02 |
/*與產品相關的類放.*/ |
03 |
Interface Product{ //定義產品介面 |
04 |
public function
getProductName(); |
05 |
public function
getProductPrice(); |
06 |
} |
07 |
interface Book extends
Product { // book是產品的一個分類 |
08 |
public function
getAuthor(); |
09 |
} |
10 |
class BookOnline implements
Book{ // 定義book類. |
11 |
private $productName ;
// 產品名 |
12 |
private $productPrice ;
// 產品價格 |
13 |
private $author ;
//作者 |
14 |
15 |
public function
__construct( $_bookName ){ |
16 |
$this ->productName = $_bookName ; |
17 |
//這裡放置相關初始化的程式碼. |
18 |
//與資料庫關聯的程式碼. |
19 |
} |
20 |
21 |
public function
getProductName(){ |
22 |
return $this ->productName; |
23 |
} |
24 |
25 |
public function
getProductPrice(){ |
26 |
//這裡從資料庫讀取價格. |
27 |
//假設價格是 100元. |
28 |
$this ->productPrice = 100; |
29 |
return $this ->productPrice; |
30 |
} |
31 |
32 |
public function
getAuthor(){ |
33 |
//從資料庫裡面取值. |
34 |
return $this ->author; |
35 |
}
|
36 |
} |
37 |
?> |
關於結算,我們使用了獨立的結算類,使用靜態方法做計算。產品結算。注意引數型別。
ProductSettle.php
01 |
<? |
02 |
include_once ( "User.php" ); |
03 |
include_once ( "Product.php" ); |
04 |
//買了產品到底多少錢呢? |
05 |
class ProductSettle{ |
06 |
public static
function finalPrice(User
$_user ,Product $_product , $number = 1){ |
07 |
$price =
$_user ->getDiscount() * $_product ->getProductPrice() * $number ; |
08 |
return $price ; |
09 |
} |
10 |
} |
11 |
?> |
下面的例子是實現。大家可以自己分析下。
01 |
<? |
02 |
include_once ( "./class/User.php" ); |
03 |
include_once ( "./class/Product.php" ); |
04 |
include_once ( "./class/ProductSettle.php" ); |
05 |
$number = 10; |
06 |
$book =
new BookOnline( "設計模式" ); |
07 |
$user =
new NormalUser( "Tom" ); |
08 |
$price = ProductSettle::finalPrice( $user , $book , $number ); |
09 |
$str =
"您好,尊敬的使用者 " . $user ->getName() . " <br>" ; |
10 |
$str .=
"您的級別是 " . $user ->getGrade() . ", <br>" ; |
11 |
$str .=
"您的折扣是 " . $user ->getDiscount() . "<br>" ; |
12 |
$str .=
"購買 $number 本 《 " . $book ->getProductName() ; |
13 |
$str .=
"》的價格是 $price <br><br>" ; |
14 |
echo $str ; |
15 |
$user =
new vipUser( "Tom" ); |
16 |
$price = ProductSettle::finalPrice( $user , $book , $number ); |
17 |
$str =
"您好,尊敬的使用者 " . $user ->getName() . " <br>" ; |
18 |
$str .=
"您的級別是 " . $user ->getGrade() . ", <br>" ; |
19 |
$str .=
"您的折扣是 " . $user ->getDiscount() . "<br>" ; |
20 |
$str .=
"購買 $number 本 《 " . $book ->getProductName() ; |
21 |
$str .=
"》的價格是 $price <br><br>" ; |
22 |
echo $str ; |
23 |
$user =
new InnerUser( "Tom" ); |
24 |
$price = ProductSettle::finalPrice( $user , $book , $number ); |
25 |
$str =
"您好,尊敬的使用者 " . $user ->getName() . " <br>" ; |
26 |
$str .=
"您的級別是 " . $user ->getGrade() . ", <br>" ; |
27 |
$str .=
"您的折扣是 " . $user ->getDiscount() . "<br>" ; |
28 |
$str .=
"購買 $number 本 《 " . $book ->getProductName() ; |
29 |
$str .=
"》的價格是 $price <br><br>" ; |
30 |
echo $str ; |
31 |
?> |
延伸閱讀
此文章所在專題列表如下: