经验大分享: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设计模式--策略模式(六)
php设计模式--策略模式(六)
20 0
|
2月前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
15 0
|
6天前
|
设计模式 存储 算法
PHP中常用的设计模式
设计模式是软件设计中解决问题的常见模式,它们提供了良好的实践,但使用时需注意其可能带来的耦合和测试难度问题。例如,单例模式可能导致全局状态,降低可测试性,而依赖注入可以作为更好的替代方案。
15 4
PHP中常用的设计模式
|
6天前
|
设计模式 数据库连接 PHP
PHP中的面向对象编程与设计模式应用
传统的PHP编程模式在面向对象的趋势下逐渐演进,本文探讨了面向对象编程在PHP中的应用,并深入分析了常用的设计模式如何优化代码结构和可维护性。
|
3天前
|
设计模式 缓存 前端开发
现代PHP开发中的设计模式应用与性能优化
本篇文章深入探讨了PHP开发中设计模式的实际应用及其对性能的影响。通过分析具体案例和最新研究成果,文章揭示了合理运用设计模式不仅可以提升代码的可维护性和扩展性,还能在特定场景下优化性能。我们将一起探索如何通过科学方法将设计模式融入日常开发实践,同时保持代码的高效执行。
|
16天前
|
设计模式 PHP 开发者
PHP中的设计模式及其应用
在现代软件开发中,设计模式是一种被广泛采纳的方法论,能够帮助开发者解决常见的设计问题并提高代码的灵活性和可维护性。本文将深入探讨PHP中几种常用的设计模式,包括工厂模式、单例模式和观察者模式,分析它们的实现方式以及在实际项目中的应用场景,帮助读者理解和运用这些模式来优化自己的PHP代码设计。
|
2月前
|
设计模式 算法 搜索推荐
【PHP开发专栏】PHP设计模式解析与实践
【4月更文挑战第29天】本文介绍了设计模式在PHP开发中的应用,包括创建型(如单例、工厂模式)、结构型和行为型模式(如观察者、策略模式)。通过示例展示了如何在PHP中实现这些模式,强调了它们在提升代码可维护性和可扩展性方面的作用。设计模式是解决常见问题的最佳实践,但在使用时需避免过度设计,根据实际需求选择合适的设计模式。
|
2月前
|
设计模式 PHP
php设计模式--观察者模式(4.2)PHP实现观察者模式
php设计模式--观察者模式(4.2)PHP实现观察者模式
22 0
|
2月前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
19 0
|
Web App开发 PHP
业余初学php经验1
学习网站:http://www.w3school.com.cn/php/index.asp 最新中文php手册下载:http://cn2.php.net/distributions/manual/php_enhanced_zh.chm 开始使用写php的时候,里面的php代码不解释,直接按原样输出了,我就很纳闷呀,用utf-8编码能解释,就是中文乱码,用unicode编码中文件不乱码了,就是php不解释,开始以为是 php 出问题呢,后来想到了页面被浏览器显示的问题。
903 0