经验大分享:php常见五种设计模式

简介: 经验大分享:php常见五种设计模式

php面向对象基础知识 请点击查看

一、常见的设计模式主要有23种,根据使用目标的不同可以分为以下三大类:创建设计模式、结构设计模式、行为模式

创建设计模式: (5种)

用于创建对象时的设计模式.初始化对象流程的设计模式.当程序复杂时,需要灵活创建对象,同时减少创建时的依赖.创建设计模式就是解决此问题的一类设计模式.

(1)单例模式

(2)工厂模式

(3)抽象工厂模式

(4)建造者模式

(5)原型模式

结构设计模式: (7种)

用于继承和接口时的设计模式.结构设计模式用于新类的函数方法设计,减少不必要的类定义,减少代码的冗余.

(1)适配器模式

(2)桥接模式

(3)合成模式

(4)装饰器模式

(5)门面模式

(6)代理模式

(7)享元模式

行为模式: (11种)

用于方法实现以及对应算法的设计模式,同时也是最复杂的设计模式.行为设计模式不仅仅用于定义类的函数行为,同时也用于不同类之间的协议、通信.

(1)策略模式

(2)模板方法模式

(3)观察者模式

(4)迭代器模式

(5)责任链模式

(6)命令模式

(7)备忘录模式

(8)状态模式

(9)访问者模式

(10)中介者模式

(11)解释器模式

二、按照范围分为: 类的设计模式,以及对象设计模式

类的设计模式:用于类的具体实现的设计模式.包含了如何设计和定义类,以及父类和子类的设计模式.

对象设计模式: 用于对象的设计模式.与类的设计模式不同,对象设计模式主要用于运行期对象的状态改变、动态行为变更等.

三、设计模式六大原则

开放封闭原则: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭.

里氏替换原则: 所有引用基类的地方必须能透明地使用其子类的对象.

依赖倒置原则: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象.

单一职责原则: 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责.

接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上.

迪米特法则: 一个对象应该对其他对象保持最少的了解.

单例模式

单例模式解决的是如何在整个项目中创建唯一对象实例的问题. (示例demo:)

1 <?php

2 //单例模式:保证某个类只有一个实例,能自行实例化对象,完成其所有的功能操作.

3 //最典型案例:数据库操作(单例模式可以避免大量的new操作.每一次new操作都会消耗系统和内存的资源.)

4 header("Content-Type: text/html;charset=utf-8");

5 class User{

6 //静态的私有属性(保存一个当前类的唯一对象)

7 private static $instance;

8 //私有的构造方法,防止类外new新对象

9 private function construct(){

10 }

11 //私有的克隆方法,防止类外克隆新对象

12 private function clone(){

13

14 }

15 //静态的公开方法,得到当前类的对象

16 public static function getInstance(){

17 if(!self::$instance){

18 self::$instance = new self();

19 }

20 return self::$instance;

21 }

22

23 private $name;

24 public function setName($n){

25 $this->name = $n;

26 }

27 public function getName(){

28 echo $this->name;

29 }

30

31 }//代码效果参考:http://www.ezhiqi.com/zx/art_1300.html

32 $userA = User::getInstance();

33 $userB = User::getInstance();

34 echo '

'.'单例模式获取唯一实例:'.'

';

35 var_dump($userA,$userB);

36

37 echo ''.'单例模式获取当前类私有属性:'.'

';

38 $userA->setName('admin_a');

39 $userB->setName('admin_b');

40 $userA->getName();

41 echo '

';

42 $userB->getName();

运行结果如下图:

工厂模式

工厂模式解决的是如何不通过new建立实例对象的方法. (示例demo)

1 <?php

2 //工厂模式:实例化对象模式,工厂方法代替new操作的一种设计模式.

3 //优点:避免当改变某个类的名字或者方法之后,调用这个类的所有的代码中都修改它的名字或者参数.(为系统结构提供灵活的动态扩展机制,减少了耦合)

4 //简单工厂模式生产对象 实例demo

5 interface People{

6 public function sex();

7 }

8

9 class Man implements People{

10 public function sex(){

11 echo 'this is Men'.'

';

12 }

13 }

14

15 class Women implements People{

16 public function sex(){

17 echo 'this is Women'.'

';

18 }

19 }

20

21 class Factoty{

22 static function getObject($class_name){

23 //可变类,生产新对象

24 return new $class_name;

25 }

26 }

27

28 $man = Factoty::getObject('Man');

29 $man->sex();

30 $woman = Factoty::getObject('Women');

31 $woman->sex();

运行结果如下图:

观察者模式

当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新. (示例demo)

1 <?php

2 //观察者模式:某个对象可以被设置为是可观察的,只要通过某种方式允许其他对象注册为观察者.每当被观察的对象改变时,会发送信息给观察者

3

4 //获取类名和发送消息接口

5 interface IObserver{

6 public function onSendMsg($msg);

7 public function getName();

8 }

9 //添加可观察者接口

10 interface IObservable{

11 //注意:$observer是个对象,需要保存到数组中

12 public function addObserver($observer);

13 }

14

15 class UserList implements IObservable{

16 private $_observers = array();

17 //添加观察者

18 public function addObserver($observer){

19 $a=$this->_observers【】= $observer;

20 }

21 //移除观察者 (注意:其实就是移除对应的类)

22 public function removeObserver($observer_name) {

23 foreach($this->_observers as $index => $observer) {

24 if ($observer->getName() === $observer_name) {

25 //从数组中移除选定的元素

26 return array_splice($this->_observers, $index, 1);

27 }

28 }

29 }

30 //发送消息

31 public function sendMsg($msg){

32 foreach($this->_observers as $v){

33 $v->onSendMsg($msg);

34 }

35 }

36 }

37

38 class OneObserver implements IObserver{

39 public function onSendMsg($args){

40 echo($args.'=> send to OneObserver

');

41 }

42 public function getName(){

43 return 'OneObserver';

44 }

45 }

46

47 class TwoObserver implements IObserver{

48 public function onSendMsg($args){

49 echo($args.'=> send to TwoObserver

');

50 }

51 public function getName(){

52 return 'TwoObserver';

53 }

54 }

55

56 $ul = new UserList();//被观察者

57 $ul->addObserver(new OneObserver());//增加观察者

58 $ul->addObserver(new TwoObserver());//增加观察者

59 $ul->sendMsg('admin');//发送消息到观察者

60 $ul->removeObserver('OneObserver');//移除观察者

61 $ul->sendMsg("hello world");//发送消息到观察者

运行结果如下图:

策略模式

策略模式主要为了让客户类能够更好地使用某些算法而不需要知道其具体的实现. (示例demo)

1 <?php

2 interface Strategy { //抽象策略角色,以接口实现

3 public function do_method(); //算法接口

4 }

5

6 class ConcreteStrategyA implements Strategy { //具体策略角色A

7 public function do_method() {

8 echo 'do method A';

9 }

10 }

11

12 class ConcreteStrategyB implements Strategy { //具体策略角色B

13 public

相关文章
|
6月前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
44 0
|
6月前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
37 0
|
6月前
|
设计模式 PHP
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
37 0
|
6月前
|
设计模式 Java PHP
php设计模式--简单工厂模式(一)
php设计模式--简单工厂模式(一)
35 0
|
6月前
|
设计模式 PHP
php设计模式--单例模式(三)
php设计模式--单例模式(三)
28 0
|
6月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
35 0
|
5月前
|
设计模式 存储 算法
PHP中常用的设计模式
设计模式是软件设计中解决问题的常见模式,它们提供了良好的实践,但使用时需注意其可能带来的耦合和测试难度问题。例如,单例模式可能导致全局状态,降低可测试性,而依赖注入可以作为更好的替代方案。
40 4
PHP中常用的设计模式
|
5月前
|
设计模式 数据库连接 PHP
PHP中的面向对象编程与设计模式应用
传统的PHP编程模式在面向对象的趋势下逐渐演进,本文探讨了面向对象编程在PHP中的应用,并深入分析了常用的设计模式如何优化代码结构和可维护性。
44 1
|
5月前
|
设计模式 算法 PHP
经验大分享:php常见五种设计模式
经验大分享:php常见五种设计模式
25 0
|
5月前
|
设计模式 缓存 前端开发
现代PHP开发中的设计模式应用与性能优化
本篇文章深入探讨了PHP开发中设计模式的实际应用及其对性能的影响。通过分析具体案例和最新研究成果,文章揭示了合理运用设计模式不仅可以提升代码的可维护性和扩展性,还能在特定场景下优化性能。我们将一起探索如何通过科学方法将设计模式融入日常开发实践,同时保持代码的高效执行。

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78