我们设计一个在线销售系统,用户部分设计如下:

将用户分为,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 ?>

  

PHP面向对象--接口实例的更多相关文章

  1. 面向对象:静态属性,静态方法,组合,继承,衍生,继承之mro线性顺序列表,面向对象综合实例

    1.静态属性(附有装饰器) class Room: def __init__(self,name,owner,width,length,height): self.name=name self.own ...

  2. 规则引擎集成接口(八)Java接口实例

    接口实例 右键点击“对象库” —“添加接口实例”,如下图: 弹出如下窗体: 输入接口的参数信息: 点击接口“求和”,选择选项卡“求和操作”,点击添加图标   ,如下: 弹出如下窗体,勾选方法“coun ...

  3. 面向对象继承实例(a如何继承b)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. js原生设计模式——3简单工厂模式\js面向对象编程实例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  5. MyBatis 源码分析——生成Statement接口实例

    JDBC的知识对于JAVA开发人员来讲在简单不过的知识了.PreparedStatement的作用更是胸有成竹.我们最常见用到有俩个方法:executeQuery方法和executeUpdate方法. ...

  6. javaScript 面向对象开发实例

    javaScript 面向对象开发实例 这个是结合require的模块化开发,首先创建构造函数: //test.js 1 function Test(lists) { var config={ nam ...

  7. Easy-Mock模拟get接口和post接口实例

    1.先创建项目,再新建接口 创建项目入口:首页右下角 + 按钮 创建接口入口如下图: 关于mock的语法这里不做说明,可查看mock.js官方查看更详情的资料. 小tip:在Easy-Mock里面支持 ...

  8. Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类

    接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...

  9. postman+jmeter接口实例

    接口基础 一.为什么要单独测试接口? 1. 程序是分开开发的,前端还没有开发,后端已经开发完了,可以提前进入测试2. 接口直接返回的数据------越底层发现bug,修复成本是越低的3. 接口测试能模 ...

随机推荐

  1. 【题解】[APIO2009]会议中心

    [题解][P3626 APIO2009]会议中心 真的是一道好题!!!刷新了我对倍增浅显的认识. 此题若没有第二份输出一个字典序的方案,就是一道\(sort+\)贪心,但是第二问使得我们要用另外的办法 ...

  2. 解决win7打印机共享出现“无法保存打印机设置(错误0x000006d9)的问题

    最新解决win7打印机共享出现“无法保存打印机设置(错误0x000006d9)的问题,由系统下载吧率先分享: 有些用户在使用Windows7系统过程中,碰到到win7打印机共享出现“无法保存打印机设置 ...

  3. 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

    今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFEx ...

  4. python 创建一个实例:步骤一 编写一个构造函数

    编写一个构造函数 #在python中,person 类的第一件是就是记录关于人员的基本信息,这叫做实例对象属性,并且它们通常通过给类方法函数中的self 属性赋值来创建. #赋给实力属性第一个值得通常 ...

  5. SAP流水号

    [转]编号范围对象维护 Tcode: SNRO OYSM   1.Number Range的通用Tcode:SNRO   2.Number Range的通用读取函数:NUMBER_GET_NEXT 3 ...

  6. 转 EBP ESP 的理解

    PS:EBP是当前函数的存取指针,即存储或者读取数时的指针基地址:ESP就是当前函数的栈顶指针.每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈,以 ...

  7. LeetCode:访问所有节点的最短路径【847】

    LeetCode:访问所有节点的最短路径[847] 题目描述 给出 graph 为有 N 个节点(编号为 0, 1, 2, ..., N-1)的无向连通图. graph.length = N,且只有节 ...

  8. appium-andriod自动化实现注意项

    注意项: 1.appium需要全局安装,否则run test case 报错“appium not installed” 2.启动appium命令 node /Applications/Appium. ...

  9. bind、call、apply的区别与实现原理

    1.简单说一下bind.call.apply的区别 三者都是用于改变函数体内this的指向,但是bind与apply和call的最大的区别是:bind不会立即调用,而是返回一个新函数,称为绑定函数,其 ...

  10. poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))

    The Settlers of Catan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1123   Accepted: ...