经验大分享: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

相关文章
|
2天前
|
设计模式 缓存 数据库连接
深入理解PHP的面向对象编程与设计模式####
本文旨在通过实例解析PHP中面向对象编程的核心概念及其在实际开发中的应用,特别是单例模式、工厂模式和观察者模式等常见设计模式。文章将展示这些模式如何帮助开发者构建更加灵活、可维护的代码结构,以及它们在解决具体问题时的优势。 ####
|
12天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
11 1
|
25天前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
22天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
28天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
27天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
28 1
|
28天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
17 2
|
24天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
16 0
|
24天前
|
设计模式 存储 安全
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和重用性的关键技术之一。本文将深入探讨单例模式(Singleton Pattern)的原理、实现方式及其在PHP中的应用,同时通过实例展示如何在具体的项目场景中有效利用单例模式来管理和组织对象,确保全局唯一性的实现和最佳实践。
|
27天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 在PHP开发领域,设计模式是提升代码可维护性、扩展性和重用性的关键技术之一。本文聚焦于策略模式这一行为型设计模式,通过理论阐述与实例分析,揭示其在PHP应用程序中优化算法切换和业务逻辑解耦方面的强大效用。不同于常规摘要,本文不直接概述研究方法或结果,而是基于实际开发场景,探讨策略模式的应用价值和实现方式,旨在为PHP开发者提供一种高效应对复杂业务需求变化和技术债务累积问题的策略思维。
下一篇
无影云桌面