本人近期正在学习php,所以就以设计模式的基础来谈一下自己的一些看法

  一:什么是设计模式

  学习编程的应该很多都有听说过设计模式,经常是什么js的设计模式,php设计模式,那么什么是设计模式呢?通俗的讲,设计模式就是一套被反复使用,很多人都知晓的,代码设计经验的总结,更功利的说法是,设计模式是为了可重用代码,更容易让其他人理解,保证了代码的可靠性。其核心有四个部分组成,就是命名,问题,解决方案,效果。当然,这些空套话多说了也是无益,下面我就以一个循序渐进的例子来简要的谈下,设计模式是有多么重要。

第一版:最原始的做法,以Lesson类的课程销售系统为例子

  以大学中的选课系统中的一个简单的例子,我们这里有一个关于Lesson的类,所谓‘类’,这个说起来大家都很熟悉,无非包含的就是方法和属性,那么我就简要的给这个类定义两个属性和两个方法,文字书写比较麻烦,我就以一个简单的图来展示一下

很明显,这个就是给这个类定义了_num,_type属性,以及cost()和type()方法,至于具体的使用观看看以下的代码

 1 <?php
 2 //课程类
 3 class Lesson {
 4     //课程购买人数
 5     private $_num;
 6     //课程的类型
 7     private $_type;
 8     //计算机课的标识
 9     const COMPUTER = 1;
10     //数学课的标识
11     const MATH = 2;
12     //构造方法初始化
13     public function __construct($_num, $_type) {
14         $this->_num = $_num;
15         $this->_type = $_type;
16     }
17     //返回课程所需的费用
18     public function cost() {
19         switch ($this->_type) {
20             case self::COMPUTER :
21                 return 300 * $this->_num;
22                 break;
23             case self::MATH :
24                 return 180 * $this->_num;
25                 break;
26         }
27     }
28     //返回购买的课程
29     public function type() {
30         switch ($this->_type) {
31             case self::COMPUTER :
32                 return '您购买的是计算机课!';
33                 break;
34             case self::MATH :
35                 return '您购买的是数学课!';
36                 break;
37         }
38     }
39 }
40 ?>

稍微有点基础的人应该都能看懂这段代码,就是简单的给这个类定义了两个属性,而且注释说的很详细,所以这里不再进行更多的阐释,至于客户端的调用也是非常的简单,就是new Lesson(),在括号内传入两个参数,比如说new Lesson(5,Lesson::MATH),然后将这个结果赋值给一个变量,然后这个变量就可以调用定义好的方法了,当然前提是要先require这个php文件,客户端这里看起来没有很大的问题,但是,我们看看这个Lesson这个类,如果我们进行进行添加属性和方法时,会遇到很大的麻烦,比如说,我们想要添加一个sport这个课程,就要跟其他的两个选课一样,先要定义一个常量,然后还要再两个方法中,依次添加关于这个sport的东西,照葫芦画瓢,跟其他的两个课程一样,这样看起来,添加一个两个问题倒不是很大,但是要添加很多个课程的时候,就会非常的繁琐,而且很容易出错,这里是两个方法还好的,但是如果这里涉及很多方法,就为了这么的一个新课程,还要依次在这些方法里添加这个课程的东西,确实很繁琐,所以便有了下面的改进。

二:用继承的方法让子类做具体的实现

  废话不多少,先上图

一眼看这个图,感觉主类跟前面的一种方法没啥区别,而且这个继承,要怎么继承,所以接下来看代码最为重要,这里我是需要四个类,Lesson.class.php,English.class.php,Math.class.php和lesson.php

先看Lesson.class.php的代码

 1 <?php
 2 //抽象课程类
 3 abstract class Lesson {
 4     //课程购买人数
 5     protected $_num;
 6
 7     //构造方法初始化
 8     public function __construct($_num) {
 9         $this->_num = $_num;
10     }
11
12     //返回课程所需的费用
13     abstract public function cost();
14
15     //返回购买的课程
16     abstract public function type();
17
18 }
19 ?>

很明显这里定义了一个抽象类,一个属性,构造函数,以及两个方法,这里的方法之所以都定义为抽象方法,其主要的目的就是为了让子类去继承,那么我们就以English为例子来说明怎么利用这个父类

 1 <?php
 2 class English extends Lesson {
 3     public function cost() {
 4         return 300 * $this->_num;
 5     }
 6     public function type() {
 7         return '您购买的是英语课程!';
 8     }
 9 }
10 ?>

很简单是吧,就是重写了父类的两个方法,同样的,另外的一个课程Math也是一样,只需要根据自己的需求对cost()方法和type()方法进行改善就行,那么客户端要怎么进行调用呢,很容易,就以英语这个课程来说,先new English(),然后在括号中传递一个参数,表示人数,数学的话也是一样的道理,当然还是要require相关的文件然后将这个new出来的对象传递给一个变量,之后就可以调用其中的方法了,那么这个看起来跟上面的那一种有什么好处呢?比起之前的那种,现在比如说你要添加其他课程的话,比如说体育,那么就是直接再弄出来一个sport类,继承父类,再写上相应东西就行,不用担心写错了,写漏了这些,而且不去动用父类,要知道,动用父类是比较危险的。但是这样也是有一个坏处,就是无法实现多态,就是无法动态的切换类,这样,又是一大缺点了。所以就引出来接下来的第三种方式。第三种方式可以实现动态的去切换类。也就是实现所谓的多态

三:使用了组合的策略模式代替继承

先上图先

比起之前的模式,这次就是在Lesson中加了strategy,那么这个具体要怎么用呢?加了这个之后怎样实现多态呢?别急,我先使用一段代码来展示一下,这个是Lesson.class.php的代码。

 1 <?php
 2 //课程类
 3 class Lesson {
 4     //课程购买人数
 5     private $_num;
 6     //策略属性字段,保存具体策略角色对象的引用,例如English对象或者Math对象
 7     private $_strategy;
 8
 9     //构造方法初始化
10     public function __construct($_num, $_strategy) {
11         $this->_num = $_num;
12         $this->_strategy = $_strategy;
13     }
14
15     //拦截器
16     public function __get($key) {
17         return $this->$key;
18     }
19
20     //返回具体策略角色课程所需的费用
21     public function cost() {                            //$this表示Lesson类,传递给English
22         return $this->_strategy->cost($this); //$this->_strategy保存了English对象(new English())
23     }
24
25     //返回具体策略角色购买的课程
26     public function type() {
27         return $this->_strategy->type();
28     }
29
30 }
31 ?>

那么加入的这个strategy有什么作用?先看English.class.php代码

<?php
class English  {public function cost(Lesson $_lesson) {return 300 * $_lesson->_num;}public function type() {return '您购买的是英语课程!';}
}?>

在客户端其实最主要的就是一行代码,就是$_lesson=new Lesson(5,new English()),然后在调用其中的方法,这个原理无非就是将new出来的对象传递给Lesson类的strategy,那么其中的$this->strategy就是代表的English()类,其中在使用$this->strategy->cost($this),就是English这个类调用了cost()方法,参数$this就是Lesson类,再回到English类中的cost方法,return 300 * $_lesson->_num;就是访问了Lesson类中的$_num属性,饶了这么多,究竟是有什么好处呢?再回到$_lesson=new Lesson(5,new English()),这个的好处就是可以通过传递不同的参数,实现不同的类之间进行切换,比如说我想现在进行的是Math类,就是使用$_lesson=new Lesson(5,new Math()),这也就是实现了所谓的多态,比起第二种方式的好处是实现不同的类进行切换。

四:结束语

  php的设计模式之中,还有很多的细分的东西,比如是要对一个父类进行规范,所有子类的继承这个规范的父类,还有很多的东西,今天因为时间的原因,就先钱钱的谈到这里,因为这是刚学习不久,也是自己的第一篇php博客,所以难免漏洞,今后一定对于这个设计模式进行更深一步的完善的博客再推出来。

转载于:https://www.cnblogs.com/jtxn/p/5425972.html

浅谈php之设计模式基础相关推荐

  1. 计算机基础课教学心得,浅谈高专院校计算机基础课程的教学心得体会养

    浅谈高专院校计算机基础课程的教学心得体会养 计算机基础课程是学生在高专接受计算机教育的先导课程,也是计算机应用的重要课程,着重于计算机的基础知识.基本概念和基本操作技能,并兼顾实用软件的使用和计算机应 ...

  2. 浅谈深度学习的基础——神经网络算法(科普)

    浅谈深度学习的基础--神经网络算法(科普) 神经网络算法是一门重要的机器学习技术.它是目前最为火热的研究方向--深度学习的基础.学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助 ...

  3. 浅谈Android游戏开发基础和经验

    Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...

  4. 职中计算机专业入门基础知识,浅谈职业中学《计算机应用基础》的教法论文

    浅谈职业中学<计算机应用基础>的教法论文 论文摘要:<计算机应用基础>是职业中学各专业学生必修的课程之一,在教育学中如何从学生实际出发,创造良好的课堂氛围,合理的师生互动,丰富 ...

  5. 浅谈计算机网络及交换机基础配置

    @浅谈计算机网络1 本文主要面对网络工程的同学请见谅 同时也是一些常识吧 有问题的话欢迎私信 简介 什么是计算机网络? -硬件方面:通过线缆链接将网络设备和计算机连接起来 -软件方面:操作系统,应用软 ...

  6. 【安全漏洞】浅谈Bypass Waf (基础-实战)

    前言-基础篇 在了解Bypass Waf之前,我们应该首先了解一些前置知识: 1.Waf是什么 2.Waf的类型 3.Waf的工作原理 1. Waf是什么 Waf全称为Web Application ...

  7. 浅谈自己学习设计模式的感受

    对于开发工作者的世界,不管是开发讨论会上还是学习交流会上,更或者面试的时候,当提及设计模式,都会或多或少的让别人高看你一眼.为什么它会有这么强大的魅力呢! 有些人说,主要是因为设计模式太抽象,不好理解 ...

  8. 上计算机课提什么讨论,浅谈中职计算机应用基础课堂中的有效讨论

    课堂讨论是师生共同构建的一种教学行为,其主要目的是活跃课堂气氛,发挥学生主体地位,凸显学生能力,彰显学生个性,增强学生的自信心,从而提高学生运用计算机技能解决实际问题的能力.我们平时在听课.上课中发现 ...

  9. 浅谈25种设计模式(4/25)(此坑未填)

    设计模式汇总 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 工厂模式(Fact ...

最新文章

  1. c语言坐标正反算代码,C语言代码逆向的实战十篇(原创)
  2. Kali Linux”下列签名无效“解决办法
  3. 计算机二级c在哪里学习,2017年计算机二级C语言考点学习
  4. RISC-V工具链环境(基于Debian/Linux操作系统)
  5. java制定年月日第几天_(JAVA)输入年月日,计算日期是今年的第几天?
  6. X264学习笔记(1)
  7. linux搭建Django环境,linux下搭建python Django环境及启动一个示例
  8. 超分20220225讨论
  9. 自然语言处理NLP知识结构
  10. office 打开wps乱_wps和office冲突怎么办
  11. GDPR 和个人信息保护的小知识
  12. ibm大型机服务器虚拟化,PowerVM:IBM小型机虚拟化的利器
  13. Tenorshare UltData(苹果数据恢复软件)v8.5.3官方版
  14. CH3 HTML基础 1
  15. Python WindowsError
  16. android打开cad卡顿,两万高配置电脑使用CAD非常卡顿怎么办
  17. 基于ITIL的医院信息化服务管理实践(客户说)
  18. 一个OneDark风格的Pycharm配色方案
  19. Tushare介绍、安装及快速入门
  20. blogger_如何在博客中添加推文并调试基本JavaScript:为什么Twitter.com/JavaScript/Blogger JSONP Widget停止工作?...

热门文章

  1. Professional ASP.NET 2.0之跨页提交-Cross Page Posting
  2. 使用OpenCV的分水岭算法
  3. jmeter导出测试报告
  4. 在Paint事件中绘制控件(边框)
  5. 64位Win8企业版出现“Unknown Hard Error”系统警告的一个解决方法
  6. 【辨异】inverse, reverse, converse
  7. 第七章7.8示例学习:统计每个字母出现的次数
  8. 数据安全治理面临哪些挑战
  9. 什么是数据治理的方法论
  10. 机器学习及算法-python