我们设计一个在线销售系统,用户部分设计如下:
将用户分为,NormalUser, VipUser, InnerUser三种。
要求根据用户的不同折扣计算用户购买产品的价格。
并要求为以后扩展和维护预留空间。
用户部分先声明了一个接口User,用户都是User的实现。
User.php 01 <? 02 /* 03 * 定义了 User接口. 04 * 和子类 NormalUser,VipUser,InnerUser 05 */ 06 //User接口,定义了三个抽象方法. 07 interface User{ 08 publicfunction getName(); 09 publicfunction setName($_name); 10 publicfunction getDiscount(); 11 } 12 abstract classAbstractUser implements User{ 13 private$name = "";//名字 14 protected $discount = 0; //折扣 15 protected $grade = ""; //级别 16 17 publicfunction __construct($_name){ 18 $this->setName($_name); 19 } 20 publicfunction getName(){ 21 return$this->name; 22 } 23 publicfunction setName($_name){ 24 $this->name =$_name; 25 } 26 publicfunction getDiscount(){ 27 return$this->discount; 28 } 29 30 publicfunction getGrade(){ 31 return$this->grade; 32 } 33 } 34 class NormalUserextends AbstractUser { 35 protected $discount = 1.0; 36 protected $grade = "NormalUser"; 37 } 38 class VipUserextends AbstractUser { 39 protected $discount = 0.8; 40 protected $grade = "VipUser"; 41 } 42 class InnerUserextends 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 publicfunction getProductName(); 05 publicfunction getProductPrice(); 06 } 07 interface Bookextends Product { // book是产品的一个分类 08 publicfunction getAuthor(); 09 } 10 class BookOnlineimplements Book{ // 定义book类. 11 private$productName; // 产品名 12 private$productPrice; // 产品价格 13 private$author; //作者 14 15 publicfunction __construct($_bookName){ 16 $this->productName =$_bookName; 17 //这里放置相关初始化的代码. 18 //与数据库关联的代码. 19 } 20 21 publicfunction getProductName(){ 22 return$this->productName; 23 } 24 25 publicfunction getProductPrice(){ 26 //这里从数据库读取价格. 27 //假设价格是 100元. 28 $this->productPrice = 100; 29 return$this->productPrice; 30 } 31 32 publicfunction 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 publicstatic 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 ?>