PHP - 设计模式

# 为啥要学习设计模式?


苦恼一 : 在实际工作中, 阅读框架源码 或 第三方 demo 源码时, 因为类关系太复杂, 逻辑写的太🐂了, 看半天才一知半解。

苦恼二 : 必然喷过别人的代码, 觉得写的很垃圾, 尤其是领导要让你改他的代码的时候, 都有删掉重写的想法, 估计别人看我的代码也是这样的想法~~🤦‍♂️


所以写出优雅的、快速稳定的代码是各位必须做到的

# 参考链接

本文很不要脸的挂原创了,但实际参考了以下博文,但转载链接只能写一个,该如何选择,大佬请原谅。。


PHP八大设计模式

PHP设计模式全集,看这一篇就够了

设计模式


一、设计模式原则

1.1 单一职责原则

一个类只负责一项职责。

1.2 里氏替换原则

子类可扩展父类功能,但不能改变父类原有的功能。

1.3 依赖倒置原则

高层模块不应该依赖低层模式,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。

1.4 接口隔离原则

客户端不应该依赖它不需要的接口,并尽力实现单一职责原则。例: 订单接口可分为下单接口、发货接口、发货接口等,而不能将订单相关的方法都定义到一个接口中。

1.5 迪米特法则

又称为 最少知道法则,只与朋友通信,表示一个对象应该对其他对象表示最少的了解,也就是一个类除了提供公共的方法,不对外泄露任何信息。

1.6 开闭原则

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


二、设置模式

2.1 单例模式

单例模式确保某个类只有一个实例。

  • 私有化静态变量
  • 私有化构造方法
  • 私有化克隆方法
  • 私有化序列化方法
  • 静态化方法
  • final 类
<?php
final class Singleton
{
    private static $instance;
    
    private function __construct()
    {   
    }
    
    private function __clone()
    {   
    }
    
    private function __wakeup()
    {
    }
    
    public static function getInstance(): Singleton
    {
        if (static::$instance === null)
        {
            static::$instance = new Singleton();
        }
        return static::$instance;
    }
}

2.2 工厂模式

用工厂类中的方法实例化对象,当调用对象中的方法时,直接通过工厂类中的静态方法来调用对象中的方法。


如果想要更改实例化的类名,则只需要修改类名与工厂方法中 new 的类名即可。

<?php
    
/**
 * 接口
 */
interface people
{
	public function say();    
}

/**
 * 类实现接口
 */
class man implements people
{
    public function say()
    {
        echo 'man';
    }
}

/**
 * 类实现接口
 */
class woman implements people
{
    public function say()
    {
        echo 'woman';
    }
}

/**
 * 简单工厂类
 */
class echoFactory
{
    static function man()
    {
        return new man();
    }
    
    static function woman()
    {
        return new woman();
    }
}

# 调用
$man = echoFactory::man();
$man -> say();

2.3 注册模式

注册模式解决全局共享和交换对象,将已创建好的对象,挂在全局可以使用的数组上,在需要使用的时候,直接从该数组上获取该类的实现即可。

<?php

class Register
{
    protected static $objects;
    
    function set($alias, $object)
    {
        self::$objects[$alias] = $object;
    }
    
    function get($name)
    {
        return self::$objects[$name];
    }
    
    function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

2.4 策略模式

策略模式是对象的行为模式,动态的选择需要调用的类。


  1. 策略模式三个角色:
    1. 抽象策略角色
    2. 具体策略角色
    3. 环境角色
  2. 策略模式实现步骤:
    1. 定义抽象角色类
    2. 定义具体策略类
    3. 定义环境角色类
<?php

# 1. 定义抽象角色类
abstract class baseClass
{
    abstract function printPage();
}

# 2. 定义具体策略类
class 360Page extends baseClass
{
    function printPage()
    {
        echo '360';
    }
}
class aliPage extends baseClass
{
    function printPage()
    {
        echo 'ali';
    }
}

# 3. 定义环境角色类
class echoClass{
	public function echo(baseClass $object)
    {
        return $object->printPage();
    }
}

# 4. 实现
$obj = new echoClass();
$obj->echo( new 360Page() );

2.5 适配器模式

适配器模式就是将截然不同的函数接口封装成统一的API。PHP中例如 MySQL、MySQLI、PDO 可以封装成统一的API。比如还有 支付宝支付、微信支付等,七牛对象存储、阿里对象存储等,redis、memcache 缓存函数等

2.6 观察者模式

当一个对象发生变化时,依赖他的对象全部会收到通知,并自动更新。

# EventGenerator.php
<?php
	abstract class EventGenerator{
		private $observers = array();
    
		function addObserver(Observer $observer){
			$this->observers[]=$observer;
		}

		function notify(){
			foreach ($this->observers as $observer){
				$observer->update();
			}
		}
	}
?>

# 定义一个观察者接口 Observer.php
<?php
	interface Observer{
		function update();//这里就是在事件发生后要执行的逻辑
	}

	# 一个实现了 EventGenerator 抽象类的类,用于具体定义某个 发生的事件实现
	class Event extends EventGenerator{
		function triger(){
			echo "Event<br>";
		}
	}

	class Observer1 implements Observer{
		function update(){
			echo "逻辑 1<br>";
		}
	}

	class Observer2 implements Observer{
		function update(){
			echo "逻辑 2<br>";
		}
	}

	$event = new Event();
	$event->addObserver(new Observer1());
	$event->addObserver(new Observer2());
	$event->triger();
	$event->notify();
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值