使用匿名函数动态设置前置或者后置操作(装饰器模式的)

我的个人博客:逐步前行STEP

在维护另一个同事的代码时,由于代码量比较大而且封装程度低耦合高,维护起来不太顺手,就怕哪没注意把现有的逻辑改坏了,受到laravel-admin的保存回调功能的启发,想到了使用匿名函数来动态设置前置或者后置操作,也就是应用装饰器模式。
比如,有一个delete函数是要删除一些商品,现在有个需求需要在删除前做一些检测,满足条件才可以删除,否则直接响应错误提示。
不使用装饰器模式的话,只能往原来的代码插入新的逻辑,而且又有新的需求的话还要继续破坏原来的代码,这种方式,可维护性和安全性都比较差。
而使用装饰器模式,只需要不破坏原来逻辑的基础上去增加[设置装饰者]的逻辑,一次改变终身受益~。
下面是具体的解决方案:

class Production
{
	private $deleting = [];
	//......
	
	//删除
	public function delete()
	{
		if(($response = $this->callDeleting()) instanceof JsonResponse)return $response;

		//......
		//这是原有的删除逻辑
	}
	
	//前置操作调用
	public function callDeleting()
	{
		foreach($this->deleting as $func)
		{
			if($func instanceof \Closure && $ret = call_user_func($func,$this) instanceof JsonResponse)
			return $ret;
		}
	}
	
	//设置前置操作
	public function deleteBefore(\Closure $closure)
	{
		$this->deleting[] = $closure;
	}
	//......后置操作类似
}

这样的话,在使用删除功能的时候,需要增加前置或者后置操作时,只需要调用deleteBefore函数添加匿名函数就行了。
具体使用如下:

class  IndexController
{
	//在此响应删除接口
	public function delPro($pro_id)
	{
		$pro = new Production($pro_id);
		//删除前商品前先记录商品的快照
		$pro->deleteBefore(function(){
			if(! Snap::record('production',$pro))return response('快照操作失败',500);
		});
		//执行删除
		$pro->delete();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闲敲代码、落灯花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值