天涯论坛

 找回密码
 立即注册
搜索
查看: 25|回复: 5

PHP设计模式-责任链/策略/装饰器/适配器/桥接模式

[复制链接]

3046

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109048
发表于 2024-10-4 18:01:59 | 显示全部楼层 |阅读模式

微X公众号:PHP在线

责任链模式:

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行径型模式。

在这种模式中,一般每一个接收者都包括对另一个接收者的引用。如果一个对象不可处理该请求,那样它会把相同的请求传给下一个接收者,依此类推。

避免请求发送者与接收者耦合在一块,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上就可,无须关心请求的处理细节和请求的传递

示例代码:

<?php

/**

 * @authors BaAGee (asm19950109@hotmail

.com)

 * @date

    2017-09-22 20:39:14

 */
// 领班class Foreman

{

    // 自己的等级    private $level=1

;

    // 上级    protected$superior=Director

;

    public function process($level)

{

        if($this

->level>=$level){

            // 自己能处理问题的级别大于等于当前事情级别,就自己处理            echo 领班处理

.PHP_EOL;

        }else

{

            (new $this

->superior)->process($level);

        }

    }

}

// 主管class Director

{

    // 自己的等级    private $level=2

;

    // 上级    protected $superior=Manager

;

    public function process($level)

{

        if($this

->level>=$level){

            echo 主管处理

.PHP_EOL;

        }else

{

            (new $this

->superior)->process($level);

        }

    }

}

// 经理class Manager

{

    // 自己的等级    private $level=3

;

    // 上级    protected $superior=TopManager

;

    public function process($level)

{

        if($this

->level>=$level){

            echo 经理处理

.PHP_EOL;

        }else

{

            (new $this

->superior)->process($level);

        }

    }

}

// 总经理class TopManager

{

    // 自己的等级    private $level=4

;

    // 上级    protected $superior=President

;

    public function process($level)

{

        if($this

->level>=$level){

            echo 总经理处理

.PHP_EOL;

        }else

{

            (new $this

->superior)->process($level);

        }

    }

}

// 董事长class President

{

    // 自己的等级    private $level=5

;

    public function process($level)

{

        echo 董事长处理

.PHP_EOL;

    }

}

// 责任链模式处理问题$level=rand(1,5

);

print(问题级别:

.$level);

$foreman=new

 Foreman();

$foreman->process($level);

策略模式:

示例代码

<?php

/**

 * @authors BaAGee (asm19950109@hotmail

.com)

 * @date

    2017-09-22 21:03:36

 */
// 计算的接口interface Calc

{

    public function process($num1,$num2)

;

}

// 加法计算class AddCalc implements Calc

{

    public function process($num1,$num2)

{

        return

 $num1+$num2;

    }

}

// 减法计算class SubtractCalc implements Calc

{

    public function process($num1,$num2)

{

        return

 $num1-$num2;

    }

}

// 乘法计算class MultiplyCalc implements Calc

{

    public function process($num1,$num2)

{

        return

$num1*$num2;

    }

}

// 除法计算class DivideCalc implements Calc

{

    public function process($num1,$num2)

{

        return

 $num1/$num2;

    }

}

// 计算器类class Calculator

{

    // 保留计算类    private $calc=null

;

    

/**

     * @param

 [string] $operator [计算器运算办法]

     */
    public function __construct($operator)

{

        $operCalc=$operator.Calc

;

        $this->calc=new

 $operCalc();

    }

    // 计算    public function calc($num1,$num2)

{

        return $this

->calc->process($num1,$num2);

    }

}

$operators=array(Add,Subtract,Divide,Multiply

);

$oper=$operators[rand(0,3

)];

$calculator=new

Calculator($oper);

$res=$calculator->calc(100,2

);

echo 100 .$oper. 2 res:

.$res;

装饰器模式

示例代码:

<?php

/**

 * @authors BaAGee (asm19950109@hotmail

.com)

 * @date

2017-09-22 21:35:00

 */
// 装饰器模式做文案修饰功能// 基本的文案class BaseArticle

{

    // 文案内容    protected

 $text;

    // 文案对象    protected $artObj=null

;

    public function __construct($text)

{

        $this

->text=$text;

    }

    public function decorator()

{

        return $this

->text;

    }

}

// 添加文案摘要,继承基本文案class SummaryArticle extends BaseArticle

{

    // 传递一个文案对象    public function __construct(BaseArticle $artObj)

{

        $this

->artObj=$artObj;

        $this

->decorator();

    }

    public function decorator()

{

        return $this->text=【加了摘要】.$this

->artObj->text;

    }

}

// 添加文案写作时间,继承基本文案class TimeArticle extends BaseArticle

{

    public function __construct(BaseArticle $artObj)

{

        $this

->artObj=$artObj;

        $this

->decorator();

    }

    public function decorator()

{

        return $this->text=$this->artObj->text.【时间:.date(Y-m-d H:i:s).

;

    }

}

$ba=new BaseArticle(文案主体-文案主体-文案主体-文案主体。

);

$sa=new

 SummaryArticle($ba);

$ta=new

TimeArticle($sa);

echo

 $ba->decorator().PHP_EOL;

echo

 $sa->decorator().PHP_EOL;

echo

 $ta->decorator().PHP_EOL;

适配器模式

示例代码

<?php

/**

 * @authors BaAGee (asm19950109@hotmail

.com)

 * @date

    2017-09-22 22:06:05

 */
// 假设天气接口class Weather

{

    public static function show()

{

        $today=array

(

            "city"=>"北京"

,

            "cityid"=>"101010100"

,

            "temp1"=>"24℃"

,

            "temp2"=>"11℃"

,

            "weather"=>"雷阵雨转多云"

        );

        // 将数据序列化,只能是php才可反序列化操作        /*a:5:{s:4:"city";s:6:"北京";s:6:"cityid";s:9:"101010100";s:5:"temp1";s:5:"24℃";s:5:"temp2";s:5:"11℃";s:7:"weather";s:18:"雷阵雨转多云";}城市:北京*/        return

 serialize($today);

    }

}

/**

 * 适配器将php序列化后的数据反序列化后转化成json格式,这般其他语言就能处理了

 */
class AdapterWeather extends Weather

{

    public static function show()

{

        return json_encode(unserialize(parent

::show()));

    }

}

// php客户端调用print

(Weather::show());

$weather=unserialize(Weather::show());

echo 城市:.$weather[city

].PHP_EOL;

echo 城市ID:.$weather[city

].PHP_EOL;

echo 最高温:.$weather[temp1

].PHP_EOL;

echo 最低温:.$weather[temp2

].PHP_EOL;

echo 天气:.$weather[weather

].PHP_EOL;

echo --------------以下假设是python经过适配器获取天气数据----------

.PHP_EOL;

// 假设python处理天气,经过适配器获取天气数据$weather=json_decode(AdapterWeather::show(),true

);

echo 城市:.$weather[city

].PHP_EOL;

echo 城市ID:.$weather[city

].PHP_EOL;

echo 最高温:.$weather[temp1

].PHP_EOL;

echo 最低温:.$weather[temp2

].PHP_EOL;

echo 天气:.$weather[weather

].PHP_EOL;

桥接模式

示例代码:

<?php

/**

 * @authors BaAGee (asm19950109@hotmail

.com)

 * @date

    2017-09-22 22:33:43

 */
// 抽象信息接口abstract class Message

{

    // 发送器    protected

 $sender;

    public function __construct($sender)

{

        $this

->sender=$sender;

    }

    // 发送信息    public function send($to,$msg)

{

        $msg=$this

->msg($msg);

        // 经过发送器发送信息        $this

->sender->send($to,$msg);

    }

}

// 普通信息类型class NormalMessage extends Message

{

    public function msg($msg)

{

        return 【普通】

.$msg;

    }

}

// 警告信息类型class WarningMessage extends Message

{

    public function msg($msg)

{

        return 【警告】

.$msg;

    }

}

// 危险信息类型class DangerMessage extends Message

{

    public function msg($msg)

{

        return 【危险】

.$msg;

    }

}

// 发送站内信息发送器class SiteMessageSender

{

    public function send($to,$msg)

{

        echo 给".$to."发送站内信息

.$msg.PHP_EOL;

    }

}

// 发送email信息发送器class EmailMessageSender

{

    public function send($to,$msg)

{

        echo 给".$to."发送Email信息

.$msg.PHP_EOL;

    }

}

// 发送短信信息发送器class SMSMessageSender

{

    public function send($to,$msg)

{

        echo 给".$to."发送短信信息

.$msg.PHP_EOL;

    }

}

// 总共有9种组合方式,然则仅仅需要6个类$normal_msg=newNormalMessage(new

 SiteMessageSender());

$normal_msg->send(小红,normal信息信息信息

);

$normal_msg=new NormalMessage(new

 EmailMessageSender());

$normal_msg->send(小红,normal信息信息信息

);

$normal_msg=new NormalMessage(new

 SMSMessageSender());

$normal_msg->send(小红,normal信息信息信息

);

$warning_msg=new WarningMessage(new

 SiteMessageSender());

$warning_msg->send(小绿,warning信息信息信息

);

$warning_msg=new WarningMessage(new

 EmailMessageSender());

$warning_msg->send(小绿,warning信息信息信息

);

$warning_msg=newWarningMessage(new

 SMSMessageSender());

$warning_msg->send(小绿,warning信息信息信息

);

$danger_msg=new DangerMessage(new

 SiteMessageSender());

$danger_msg->send(小花,danger信息信息信息

);

$danger_msg=new DangerMessage(new

 EmailMessageSender());

$danger_msg->send(小花,danger信息信息信息

);

$danger_msg=new DangerMessage(new

 SMSMessageSender());

$danger_msg->send(小花,danger信息信息信息

);

转载:baagee博客,感谢作者





上一篇:南方网“技术研发+安全运维”人员招聘
下一篇:PHP 责任链模式的用法
回复

使用道具 举报

3046

主题

3万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065856
发表于 2024-10-6 09:11:45 | 显示全部楼层
我们有着相似的经历,你的感受我深有体会。
回复

使用道具 举报

3088

主题

2万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098774
发表于 2024-10-13 09:28:51 | 显示全部楼层
楼主节操掉了,还不快捡起来!
回复

使用道具 举报

3046

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109048
 楼主| 发表于 2024-10-28 10:09:59 | 显示全部楼层
“NB”(牛×的缩写,表示叹为观止)‌
回复

使用道具 举报

3088

主题

2万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098774
发表于 2024-11-9 00:49:43 | 显示全部楼层
期待你更多的精彩评论,一起交流学习。
回复

使用道具 举报

2944

主题

2万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979435
发表于 2024-11-10 08:10:28 | 显示全部楼层
我赞同你的看法,你的智慧让人佩服,谢谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 17:52 , Processed in 0.112685 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.