微信号:phpdaily

介绍:PHP在线专注于PHP编程语言学习,PHP开发经验分享,工作问题解决以及PHP在线技能测评等多功能为一体的服务系统,希望给工作学习中的PHPER带来些帮助。

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

2018-07-16 19:53 baagee

微信公众号: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=new NormalMessage(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=new WarningMessage(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在线 更多文章 Redis数据结构详解,五种数据结构分分钟掌握 PHP实现四种基本排序算法 网站高并发解决方案(理论知识) PHP的16种错误机制总结 GitHub 的 MySQL 高可用性实践分享
猜您喜欢 谁动了我的 class? UCloud的自我突破:立足互联网创业 拓展政企新蓝海 浅谈 CSS 预处理器(一):为什么要使用预处理器? 更多的资本更少的初创企业 以色列网络安全行业走向成熟 将真爱贯彻到底,微软加入 Linux 基金会