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

将用户分为,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. 性能测试--yslow

    YSlow YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. YSlow可以分析任何网站,并为每一个规则产生一个整体报告,如果页面可以进行优化,则YSlow会 ...

  2. Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读

    本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...

  3. Django—工程创建以及models数据库易错点

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  4. 【python】使用python发送文本内容邮件

    下面提供了一个使用python做的发送文本内容的邮件代码,能够在邮件内容中设置文字颜色,大小,换行等功能. #auther by zls #_*_coding:utf-8_*_ import sys ...

  5. A. Drazil and Date

    这是codeforces#292 div2 的一道题,因为本人比较水,目前只能做div2了.问题简化版就是: 从 (0,0) 走到 (a, b) ,s 步能不能走完.每次能向上下左右走,且只能走一步. ...

  6. HTML5实现中国象棋游戏

    在线演示 本地下载

  7. 蓝天白云大草原风景PSD背景素材

    蓝天白云大草原风景PSD源文件背景素材,蓝天白云,大草原,风景,背景素材,自然风景,草原景色,绿色清新背景 地址:http://www.huiyi8.com/psd/

  8. 第三届蓝桥杯决赛c++b组

    1.星期几 [结果填空] (满分5分)     1949年的国庆节(10月1日)是星期六.      今年(2012)的国庆节是星期一.     那么,从建国到现在,有几次国庆节正好是星期日呢? 只要 ...

  9. sql中使用timestamp增量抽取数据

    网址:http://www.cnblogs.com/shuaifei/p/4469526.html 最近的项目中需要对上百万级的数据进行增量抽取操作,因此了解了一下TIMESTAMP的应用,特此记录 ...

  10. python-unittest单元测试框架

    可以理解为是已经帮我们封装好的东东,可以完成执行用例\预期与实际结果的对比等. import unittest 封装好的单元测试框架,可以直接使用 编写的测试类的继承unittest.TestCase ...