PHP面向对象--接口实例
我们设计一个在线销售系统,用户部分设计如下:
将用户分为,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面向对象--接口实例的更多相关文章
- 面向对象:静态属性,静态方法,组合,继承,衍生,继承之mro线性顺序列表,面向对象综合实例
1.静态属性(附有装饰器) class Room: def __init__(self,name,owner,width,length,height): self.name=name self.own ...
- 规则引擎集成接口(八)Java接口实例
接口实例 右键点击“对象库” —“添加接口实例”,如下图: 弹出如下窗体: 输入接口的参数信息: 点击接口“求和”,选择选项卡“求和操作”,点击添加图标 ,如下: 弹出如下窗体,勾选方法“coun ...
- 面向对象继承实例(a如何继承b)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js原生设计模式——3简单工厂模式\js面向对象编程实例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- MyBatis 源码分析——生成Statement接口实例
JDBC的知识对于JAVA开发人员来讲在简单不过的知识了.PreparedStatement的作用更是胸有成竹.我们最常见用到有俩个方法:executeQuery方法和executeUpdate方法. ...
- javaScript 面向对象开发实例
javaScript 面向对象开发实例 这个是结合require的模块化开发,首先创建构造函数: //test.js 1 function Test(lists) { var config={ nam ...
- Easy-Mock模拟get接口和post接口实例
1.先创建项目,再新建接口 创建项目入口:首页右下角 + 按钮 创建接口入口如下图: 关于mock的语法这里不做说明,可查看mock.js官方查看更详情的资料. 小tip:在Easy-Mock里面支持 ...
- Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类
接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...
- postman+jmeter接口实例
接口基础 一.为什么要单独测试接口? 1. 程序是分开开发的,前端还没有开发,后端已经开发完了,可以提前进入测试2. 接口直接返回的数据------越底层发现bug,修复成本是越低的3. 接口测试能模 ...
随机推荐
- UVa 11586 - Train Tracks
题目:给你一些积木碎片,每一个碎片的两端仅仅能是凸或凹(M或F).凸凹可拼起来.是否能拼成一个环. 分析:图论.欧拉回路.推断入度等于出度就可以,即M和F同样且大于1组. 说明:╮(╯▽╰)╭. #i ...
- 使用qt+ros调用摄像头遇到的问题
当使用摄像头遇到如下问题:[usb_cam-1] process has died [pid 12288, exit code 127, cmd /opt/ros/indigo/lib/usb_cam ...
- LightOJ - 1151 Snakes and Ladders —— 期望、高斯消元法
题目链接:https://vjudge.net/problem/LightOJ-1151 1151 - Snakes and Ladders PDF (English) Statistics F ...
- Spring Boot2.0之性能优化
1.JVM参数调优 针对运行效果 吞吐量 初始堆内存与最大堆尽量相同 减少垃圾回收次数 2.扫包优化: 启动优化 默认Tomcat容器改为Undertow Tomcat的吞吐量500 ...
- Web性能测试中的几个概念【转】
每秒查询率QPS:对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,即每秒请求数,即最大谈吐能力. 并发数:并发数和QPS是不同的概念,一般说QPS会说多少并发用户下QPS,当QPS相同时, ...
- input标签添加上disable属性在移动端字体颜色不兼容的解决办法。
input[disabled],input:disabled,input.disabled{ color: #999; -webkit-text-fill-color:#999; -webkit-op ...
- elasticsearch-installation
1. 安装Java JDK 移步 :sdfa 2. 下载elasticsearch url : https://artifacts.elastic.co/downloads/elasticsearch ...
- mvc 让伪静态变得简单
IIS 部署后访问*.* config 配置: <modules runAllManagedModulesForAllRequests="true"> < ...
- resEdit
resEdit:一个图形界面编辑工具,它不但可以用来编写程序所图形界面(如修改图标.菜单.鼠标.版本信息等),还支持了对exe.dll等执行文件内的资源(图标.菜单.鼠标指针.位图.版本信息)等进行修 ...
- 如何在asterisk中限制呼叫路数
在asterisk中,对于呼叫个数是可以通过call-limit进行限制的.限制办法是通过修改asterisk.conf中maxcalls参数,设置允许的最大呼叫数.这里的最大呼叫数是包括所有的呼 ...