php观察者模式案例

本案例为用户的邮箱及手机号操作。

1.首先定义执行的接口

<?php

namespace App\Observer;


/**
 * 实现接口的执行定义
 * Interface UserSendInterface
 * @package App\Observer
 */
interface UserSendInterface
{
    /**
     * @return mixed
     */
    public function exec();
}

2.分别定义好两个类

类:EmailService

<?php

namespace App\Observer;


/**
 * Class EmailService
 * @package App\Observer
 */
class EmailService implements UserSendInterface
{

    /**
     * @return mixed|string
     */
    public function exec()
    {
        return 'email';
    }
}

类:PhoneService

<?php

namespace App\Observer;


/**
 * Class PhoneService
 * @package App\Observer
 */
class PhoneService implements UserSendInterface
{
    /**
     * @return mixed|string
     */
    public function exec()
    {
        return 'phone';
    }
}

3.添加observer

<?php

namespace App\Observer;


/**
 * Class SetObserver
 * @package App\Observer
 */
class SetObserver
{

    /**
     * @var array 
     */
    public $observers = [];

    

    /**
     * @param                                 $name
     * @param \App\Observer\UserSendInterface $userSend
     */
    public function addObserver($name,UserSendInterface $userSend)
    {
        $this->observers[$name] = $userSend ;
    }


    /**
     * @param $name
     * @return mixed
     */
    public function getObserver($name)
    {
        return $this->observers[$name];
    }


    /**
     * @param $name
     */
    public function removeObserver($name)
    {
        unset($this->observers[$name]);
    }


    /**
     * @return array
     */
    public function notify()
    {

        $data = [];
        foreach ($this->observers as $observer) {
            $data[] = $observer->exec();
        }
        return $data;

    }
}

4.绑定一下

<?php

namespace App\Providers;

use App\Observer\EmailService;
use App\Observer\PhoneService;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
       //

    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {    
        $this->app->bind('PhoneService', PhoneService::class);
        $this->app->bind('EmailService', EmailService::class);
    }
}

5.test 执行

<?php

namespace App\Http\Controllers;

use App\Observer\SetObserver;

class TestController extends Controller
{


    public $observer;

    public function __construct(SetObserver $observer)
    {
        $this->observer = $observer;
    }

    /**
     * @return mixed
     */
    public function test()
    {
        $this->observer->addObserver('phone', app('PhoneService'));
        $this->observer->addObserver('email', app('EmailService'));

        list($phone, $email) = $this->observer->notify();


        return ['phone' => $phone, 'email' => $email];
    }
}

以上代码很简单,代码没做验证,这里仅作基础演示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝颜~岁月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值