首页 LNMP PHP 正文

PHP 设计模式(工厂,单例,观察者,责任链,策略,装饰,适配器,桥接)

金鹏头像 金鹏 PHP 2022-10-19 11:10:50 0 789
导读:工厂方法<?php/** * 工厂方法 * * @author jinpeng *&...

工厂方法

<?php
/**
 * 工厂方法
 *
 * @author jinpeng
 * @date 2022/10/19
 */

interface DB {
    function conn();
}

interface Factory {
    function createDB();
}


class MysqlDb implements DB {
    function conn()
    {
        echo "连接了MySQL";
    }
}

class SqliteDb implements DB {
    public function conn()
    {
        echo "连接了sqlite";
    }
}

// 新增oracle数据库
class OracleDb implements DB {
    public function conn()
    {
        echo "连接了oracle";
    }
}

class MysqlFactory implements Factory {
    function createDB()
    {
        return new MysqlDb();
    }
}


class SqliteFactory implements Factory {
    function createDB()
    {
        return new SqliteDb();
    }
}

// 新增oracle工厂
class OracleFactory implements Factory {
    public function createDB()
    {
        return new OracleDb();
    }
}


//=========客户端==========
//符合开闭原则,只新增,不修改。
$fact = new MysqlFactory();
$mysqlDB = $fact->createDB();
$mysqlDB->conn();

echo "<br/>";
$fact = new SqliteFactory();
$SqliteDB = $fact->createDB();
$SqliteDB->conn();

echo "<br/>";
$fact = new OracleFactory();
$OracleDB = $fact->createDB();
$OracleDB->conn();



单例模式

<?php
/**
 * 单例
 *
 * @author jinpeng
 * @date 2022/10/20
 */
class Model {
    protected static $ins = null;

    // 禁止继承修改
    final protected function __contract()
    {

    }

    // 禁止克隆
    protected function __clone()
    {
        throw new Exception("error clone");
    }

    public static function getIns()
    {
        if (self::$ins === null)
        {
            self::$ins = new self();
        }

        return self::$ins;
    }
}


$a = Model::getIns();
$b = Model::getIns();

if ($a === $b)
{
    echo '是一个对象';
}
else
{
    echo '不是一个对象';
}



观察者模式

<?php
/**
 * 观察者
 *
 * @author jinpeng
 * @date 2022/10/20
 */

class User implements SplSubject {

    public $lognum;
    public $hobby;

    protected $observers = null;

    public function __construct($hobby)
    {
        $this->lognum = rand(1, 10);
        $this->hobby = $hobby;
        $this->observers = new SplObjectStorage();
    }

    public function login()
    {
        // 验证通过

        // 通知后续环节
        $this->notify();
    }

    public function notify()
    {
        $this->observers->rewind();
        while ($this->observers->valid()) {
            //获取当前指针位置的对象
            $observers = $this->observers->current();
            $observers->update($this);
            //存储空间指针下移
            $this->observers->next();
        }
    }

    public function attach (SplObserver $observer)
    {
        $this->observers->attach($observer);
    }

    public function detach (SplObserver $observer)
    {
        $this->observers->detach($observer);
    }
}


class security implements SplObserver {
    public function update(SplSubject $subject)
    {
        if ($subject->lognum < 3)
        {
            echo '这是第' . $subject->lognum . '登录, 安全登录';
            echo "<br/>";
        }
        else
        {
            echo '这是第' . $subject->lognum . '登录, 登录异常';
            echo "<br/>";
        }
    }
}

class hobby implements SPLObserver{
    public function update(SplSubject $subject)
    {
        if ($subject->hobby == 'study')
        {
            echo '好好学习,天天向上。';
            echo "<br/>";
        }
        else if ($subject->hobby == 'sports')
        {
            echo '参加篮球比赛';
            echo "<br/>";
        }
    }
}


$user = new User('sports');
$user->attach(new security());
$user->attach(new hobby());
$user->login();



责任链模式

<?php
/**
 * 责任链
 *
 * @author jinpeng
 * @date 2022/10/20
 */


interface Approval {
    public function pass($level);
    public function reject($level);
}

class ZuZhang implements Approval {

    protected $top = 'ZhuGuan';
    protected $level = 1;

    public function pass($level)
    {
        if ($this->level >= $level)
        {
            echo "组长审批。";
        }
        else
        {
            $top = new $this->top;
            $top->pass($level);
        }
    }

    public function reject($level)
    {
        // TODO: Implement reject() method.
    }
}

class ZhuGuan implements Approval {

    protected $top = 'ZongJian';
    protected $level = 2;

    public function pass($level)
    {
        if ($this->level >= $level)
        {
            echo "主管审批。";
        }
        else
        {
            $top = new $this->top;
            $top->pass($level);
        }
    }

    public function reject($level)
    {
        // TODO: Implement reject() method.
    }
}

class ZongJian implements Approval {

    protected $top = '';
    protected $level = 3;

    public function pass($level)
    {
        echo "总监都能审批。";
    }

    public function reject($level)
    {
        // TODO: Implement reject() method.
    }
}


$c = new ZuZhang();
$c->pass(4);


策略模式

<?php
/**
 * 策略
 *
 * @author jinpeng
 * @date 2022/10/20
 */
interface Park {
    public function attr();
}

class ParkQingLongHu implements Park {
    public function attr()
    {
        echo "青龙湖公园,地处北京房山区";
    }
}

class ParkZhongShan implements Park {
    public function attr()
    {
        echo "中山公园,地处天安门广场旁";
    }
}

class ParkShouGang implements Park {
    public function attr()
    {
        echo "首钢公园,地处石景山区";
    }
}

class VirtualPark{
    protected $type;
    protected $park;

    public function __construct($type) {
        $park = "Park" . $type;
        $this->park = new $park();
    }

    public function attr()
    {
        $this->park->attr();
    }
}

$v = new VirtualPark('QingLongHu');
$v->attr();



装饰模式

<?php
/**
 * 装饰
 *
 * @author jinpeng
 * @date 2022/10/20
 */

// 文章编辑装饰功能
class BaseArt{

    protected $content;

    protected $art;

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

    public function edit()
    {
        return $this->content;
    }
}

// 小编进行操作
class BianArt extends BaseArt{

    public function __construct(BaseArt $art) {
        $this->art = $art;
        $this->edit();
    }

    public function edit()
    {
        return $this->content = $this->art->edit() . "小编进行了编辑操作";
    }
}


// SEO人员关键词优化
class SEOArt extends BaseArt{

    public function __construct(BaseArt $art) {
        $this->art = $art;
        $this->edit();
    }

    public function edit()
    {
        return $this->content = $this->art->edit() . "EEO进行了关键词操作";
    }
}

$b = new SEOArt(new BianArt(new BaseArt('天天向上')));
echo $b->edit();



适配器模式

<?php
/**
 * 适配器
 *
 * @author jinpeng
 * @date 2022/10/20
 */

class Weather{

    public function getInfo ()
    {
        $data = ['tianqi' => '晴朗', 'wendu' => 25];
        $ret = serialize($data);
        return $ret;
    }
}

class AdapterWeather extends Weather {

    public function getInfo()
    {
        $parentData = parent::getInfo();
        return json_encode(unserialize($parentData));
    }
}

// 针对不同场景 处理不同情况,符合开闭原则,只新增不修改
$w = new Weather();
echo $w->getInfo();

$w = new AdapterWeather();
echo $w->getInfo();



桥接模式

<?php
/**
 * 桥接
 *
 * @author jinpeng
 * @date 2022/10/20
 */

abstract class Info {

    protected $send = null;

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

    abstract public function msg ($content);

    public function send($to, $content)
    {
        $content = $this->msg($content);
        $this->send->send($to, $content);
    }
}

class Sms{
    public function send($to, $content)
    {
        echo "短信发送给 {$to} : {$content}";
    }
}

class Email{
    public function send($to, $content)
    {
        echo "Email发送 {$to} : {$content}";
    }
}

class App{
    public function send($to, $content)
    {
        echo "App发送 {$to} : {$content}";
    }
}


// 三种消息等级
class CommonInfo extends Info {
    public function msg($content)
    {
        return '普通:' . $content;
    }
}

class UrgentInfo extends Info {
    public function msg($content)
    {
        return '加急:' . $content;
    }
}

class DangerInfo extends Info {
    public function msg($content)
    {
        return '危险:' . $content;
    }
}

// 普通消息
$common = new CommonInfo(new App());
$common->send('小明', '起床吃饭了');

echo "<br/>";
// 加急消息
$Urgent = new UrgentInfo(new App());
$Urgent->send('小明', '起火了');

echo "<br/>";
// 危险消息
$Danger = new DangerInfo(new App());
$Danger->send('小明', '注意危险');



本文地址:https://www.jinpeng.work/?id=142
若非特殊说明,文章均属本站原创,转载请注明原链接。
广告3

欢迎 发表评论:

  • 请填写验证码

日历

«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930

控制面板

您好,欢迎到访网站!
  查看权限
广告2

退出请按Esc键