php中6种常见的设计模式

  • 单例模式
  • 观察者模式
  • 策略模式
  • 工厂模式
  • 注册模式
  • 适配器模式

单例模式

  1. Db.php
    <?php
  2. /**
  3. * 单例模式
  4. */
  5. class Db
  6. {
  7. private static $instance=null;
  8. //私有的构造方法防止外界实例化对象
  9. private function __construct($className)
  10. {
  11.  
  12. }
  13. //私有的克隆方法防止克隆
  14. private function __clone(){
  15. }
  16. //单例模式统一入口
  17. public static function getInstance(){
  18. if (!(self::$instance instanceof self))
  19. {
  20. self::$instance = new self();
  21. }
  22. return self::$instance;
  23. }
  24. }
  25. ?>

工厂模式

  这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

  在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  工厂模式下可以设立多个子工厂,而不是所有的产品有单一的工厂来生产,而是给各自特色的子工厂来生产。

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

  1. <?php
  2.  
  3. interface Transport{
  4. public function go();
  5.  
  6. }
  7.  
  8. class Bus implements Transport{
  9. public function go(){
  10. echo "bus每一站都要停";
  11. }
  12. }
  13.  
  14. class Car implements Transport{
  15. public function go(){
  16. echo "car跑的飞快";
  17. }
  18. }
  19.  
  20. class Bike implements Transport{
  21. public function go(){
  22. echo "bike比较慢";
  23. }
  24. }
  25.  
  26. class transFactory{
  27. public static function factory($transport)
  28. {
  29.  
  30. switch ($transport) {
  31. case 'bus':
  32. return new Bus();
  33. break;
  34.  
  35. case 'car':
  36. return new Car();
  37. break;
  38. case 'bike':
  39. return new Bike();
  40. break;
  41. }
  42. }
  43. }
  44.  
  45. $transport=transFactory::factory('car');
  46. $transport->go();

策略模式:

  策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立

优点:

(1)上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。

(2)策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。

  

  1. <?php
  2. interface jisuan{
  3. public function way($a,$b);
  4. }
  5. class jiajisuan implements jisuan{
  6. public function way($a,$b){
  7. echo $a+$b;
  8. }
  9. }
  10. class jianjisuan implements jisuan{
  11. public function way($a,$b){
  12. echo $a-$b;
  13. }
  14. }
  15. class chengjisuan implements jisuan{
  16. public function way($a,$b){
  17. echo $a*$b;
  18. }
  19. }
  20. class suanfa{
  21. private $a;
  22. private $b;
  23. public $_obj;
  24. public function __construct($a,$b){
  25. $this->a=$a;
  26. $this->b=$b;
  27. }
  28. public function caozuo($obj){
  29. $this->_obj=new $obj;
  30. return $this->_obj->way($this->a,$this->b);
  31. }
  32. }
  33. $suanfa =new suanfa(,);
  34. $suanfa->caozuo("chengjisuan");
  35. ?>

观察者模式

观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码

优点:

观察者模式实现了低耦合,非侵入式的通知与更新机制

  1. <?php
  2.  
  3. /**
  4. 观察者模式
  5. 定义一个接口实现两个方法
  6. 第一个方法进行注入初始化数组(传进去的参数是一个实例化后的对象数组比如猫对象)
  7. 数组内饰猫对象、狗对象、人对象
  8. 第二个方法进行通知因为传进来的是一个一维数组
  9. 遍历一维数组分别调用watch算法接受到通知
  10. */
  11. /*定义观察者接口*/
  12. interface aa{
  13. public function watch();
  14. }
  15. /*实现观察者接口*/
  16. class cat implements aa{
  17. public function watch(){
  18. echo "cat 已经收到";
  19. }
  20. }
  21. class dog implements aa{
  22. public function watch(){
  23. echo "dog 已经收到";
  24. }
  25. }
  26. class people implements aa{
  27. public function watch(){
  28. echo "people 已经收到";
  29. }
  30. }
  31. /*定义bb接口*/
  32. interface bb{
  33. /*注册接口*/
  34. public function register($obj);
  35. /*同志接口*/
  36. public function notify();
  37. }
  38. /*实现bb接口*/
  39. class Action implements bb
  40. {
  41.  
  42. public $_obj=[];
  43. public function register($obj){
  44. var_dump($obj);
  45. $this->_obj[]=$obj;
  46. }
  47. public function notify(){
  48. foreach($this->_obj as $ob){
  49. $ob->watch();
  50. }
  51. }
  52. }
  53. $action=new Action();
  54. $action->register(new cat());
  55. $action->register(new dog());
  56. $action->register(new people());
  57. $action->notify();
  58. ?>

常见的php模式的更多相关文章

  1. [转载]五种常见的电子商务模式对比:B2B、B2C、C2B、C2C、O2O

    转载自http://blog.sina.com.cn/s/blog_64e090b001016843.html 转载自http://blog.sina.com.cn/s/blog_64e090b001 ...

  2. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  3. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  4. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  5. 五种常见的电子商务模式对比:B2B、B2C、C2B、C2C、O2O

    电子商务模式是指企业运用互联网开展经营取得营业收入的基本方式,也就是指在网络环境中基于一定技术基础的商务运作方式和盈利模式.目前,常见的电子商务模式主要有B2B.B2C.C2B.C2C.O2O等几种, ...

  6. Android中常见的MVC模式

    MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...

  7. 解析C#开发过程常见的编程模式

    单例模式: 在多线程的程序开发过程中经常会遇到单例模式[单件模式],它的特点是不是根据客户程序的调用而生成新的实例,而是控制某个类型的实例数量只有一个.也就是说,单例模式就是保证在整个应用程序的生命周 ...

  8. 模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)

    一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式.是软件 ...

  9. Java常见23中设计模式之【代理模式】

    一.静态代理模式 静态代理,使用继承的方式实现自己新增的服务 这种模式可以实现帮助被代理者完成一些前期的准备工作和后期的善后工作,但是核心的业务逻辑仍然是由被代理者完成. 在某些情况下,一个客户不想或 ...

随机推荐

  1. vue项目中的tab页实现

    //需要自己弄雪碧图 <template> <div class="tab" id="tab"> <router-link to= ...

  2. python之路-----多线程与多进程

    一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...

  3. 【阅读笔记】《C程序员 从校园到职场》第八章 算法和协议(Part 2)

    原文链接: 让你提前认识软件开发(19):C语言中的协议及单元测试示例 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/2 ...

  4. 海量数据处理之top K问题

    题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...

  5. mybatis foreach 遍历list中的坑

    将jdbc改写为mybatis时,传入的条件为list使用到的标签是<where> .<choose>.<when>.<if>.<foreach& ...

  6. Android开发 ---ORMLite实现数据的增删改查,单例模式,Dao栈

    效果图: 项目目录截图: 1.activity_main.xml 描述: 两行显示8个按钮 <?xml version="1.0" encoding="utf-8& ...

  7. Sql语句内功心法

    CREATE SCHEMA <模式名> AUTHORIZATION <用户名> 定义模式实际上定义了一个命名空间,在这个空间可以进一步定义该模式包含的数据库对象,例如基本表,视 ...

  8. 划分树(poj2104)

    poj2104 题意:给出n个数,有m次查询,每次查询要你找出 l 到 r 中第 k 大的数: 思路:划分树模板题 上述图片展现了查询时如何往下递推的过程 其中ly表示 [sl,l) 中有多少个数进入 ...

  9. Layer For Mobile 弹窗 input输入文字后,点击取消确定按钮失效(需点击两次)

    webapp中使用Layer For Mobile弹出弹窗,修改昵称输入文字后,ios手机中,如果不先点击收起键盘,两个按钮点击之后无效... 两个按钮的方法是写在这里的——> 最后只能吧点击按 ...

  10. itextsharp报错PdfReader not opened with owner password

    itextSharp读取Pdf时报错:PdfReader not opened with owner password 报错原因:pdf文件被用户加密了. 解决办法:在创建pdfReader实例后,加 ...