微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博客,感谢作者
|