您的位置:首页 > 编程语言 > PHP开发

PHP常用的设计模式基本有四种

2017-03-21 16:15 603 查看
PHP常用的设计模式基本有四种: 单例模式工厂模式观察者模式策略模式; 随着一些框架涌入市面,PHP程序员写程序越来越模板化,甚至有2~3年经验的开发者也说不清这几种设计模式的作用以及应用场景。这里简单说明一下:

单例模式

class Single{

private static $obj;
public  $redis;

private function __construct(){
$this->redis=new redis();
$this->redis->connect("127.0.0.1","6379");
}

public static function door(){

if( !is_object(self::$obj) ){
self::$obj=new self();
}
return self::$obj;
}

public function init(){

echo '初始化';
}

public function __clone(){
exit('禁止clone');
}
}

$obj=Single::door();
$obj->redis->set('aa',111);
echo $obj->redis->get('aa');


结论: 防止对象重复实例化

工厂模式例子:

interface Home{
function GrandParents();
function Parents();
function Children();
}

class ZhangSanHome implements Home
{
function GrandParents(){
return __CLASS__.':'.__METHOD__;
}
function Parents(){
return __CLASS__.':'.__METHOD__;
}
function Children(){
return __CLASS__.':'.__METHOD__;
}
}
class LisiHome implements Home
{
function GrandParents(){
return __CLASS__.':'.__METHOD__;
}
function Parents(){
return __CLASS__.':'.__METHOD__;
}
function Children(){
return __CLASS__.':'.__METHOD__;
}
}
$zs=new ZhangSanHome();
echo $zs->GrandParents();echo '<br>';
echo $zs->Parents();echo '<br>';
echo $zs->Children();echo '<br>';
$ls=new LisiHome();
echo $ls->GrandParents();echo '<br>';
echo $ls->Parents();echo '<br>';
echo $ls->Children();


结论:面向对象的规范化,使用场景,像是一个模型,抽出共性,差别分别实现

观察者模式:

interface Observer {
function update($args);
}

interface Object {
function addObserver($new_observer);
function delObserver($old_observer);
function notify($args);
}
//观测对象
class Obs implements Object {
protected $observer=[];

function addObserver($new_observer){
$this->observer[]=$new_observer;
}
function delObserver($old_observer){

}
function notify($args){
foreach ($this->observer as $o) {
$o->update($args);
}
}

}
//观察者1
class ObserverOne implements Observer
{
function update($args){
echo $args.':'.__CLASS__.'<br>';
}
}
//观察者2
class ObserverTwo implements Observer
{
function update($args){
echo $args.':'.__CLASS__.'<br>';
}
}
//观察者3
class ObserverThree implements Observer
{
function update($args){
echo $args.':'.__CLASS__.'<br>';
}
}

$ob=new Obs();
$ob->addObserver( new ObserverOne() );
$ob->addObserver( new ObserverTwo() );
$ob->addObserver( new ObserverThree() );
$ob->notify('已修改完成,通知观察者');


结论: 将对象存入数组,每个对象都有一个相同名称的方法(update),操作完成后,通知数组中所有的对象。

策略模式:

interface Weapon {
function fire();
}
interface Equipment {
function ready($weapon);
function attack();
}
class Gun implements Weapon {
function fire(){
echo 'gun is firing..<br>';
}
}
class Cannon implements Weapon {
function fire(){
echo 'Cannon is firing..<br>';
}
}
class MyEquipment implements Equipment {
protected $_equipment;
function ready($weapon){
$this->_equipment=$weapon;
}
function attack(){
$this->_equipment->fire();
}
}
$equipment=new MyEquipment();
$equipment->ready(new Gun());
$equipment->attack();

$equipment->ready(new Cannon());
$equipment->attack();


结论: 将A类对象作为参数传入B类,通过B类执行A类的方法,一般用作配置加载,不同配置不同执行方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息