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. 接口测试能模 ...
随机推荐
- MLGBZ
April cloudy, boss rainy, told me he want to kick But coming so,Formosa Heart sad , Down,down,down W ...
- me12里更改信息记录的净价和有效价格,以及信息记录的条件价格
转自 http://blog.csdn.net/zeewjj/article/details/7941525REPORT ztest. DATA:l_kbetr LIKE konp-kbetr.l_k ...
- 关于Spring注解 @Service @Component @Controller @Repository 用法
@Component 相当于实例化类的对象,其他三个注解可以理解为@Component的子注解或细化. 在annotaion配置注解中用@Component来表示一个通用注释用于说明一个类是一个spr ...
- mysql错误:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated
今天迁移django数据库的时候,跑程序的时候出现这样的错误: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY cla ...
- SDUT OJ 之 连通分量个数 (dfs)
数据结构实验:连通分量个数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 在无向图中,如果从顶点vi到顶点vj有路径,则称vi ...
- Warning: Cannot send session cookie – headers already sent…
相信大多数人在写PHP代码的时候,都遇到过类似 "Warning: Cannot send session cookie – headers already sent…“或者”Cannot ...
- JS判断数字、中文、小数位数
1.JS判断数字 ①var value=$("#test").val(); if(!isNaN(value)){ alert("是数字"); }else{ al ...
- 分享知识-快乐自己:Struts2(动态方法、动态结果、通配符、方法内部跳转、action跳转、OGNL 的使用及注意事项)
这里主要以案例演示:涵盖以下知识点 1.动态方法调用:使用关键 符号 ! 进行操作 例如:/命名空间 ! 方法名 2.动态结果集:就是说,通过后台返回的结果 ${} 获取,重定向到符合预期的页面. ...
- laravel 在apache或nginx的配置
laravel 下载后,如何运行起来呢,根据自己的应用,记录了几个关键点: 1.apache 配置: 打开http.conf文件,将mod_rewrite前面的#去掉(启用重写模块): 2.nginx ...
- python- python内置模块 面向对象
1.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2 ...