5种常见的设计模式

策略模式

简介:策略模式是对象的行为模式,用意是对一组算法的封装。动态选择需要的算法并且使用。

策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强大。

策略模式的三个角色:

1,抽象策略角色,

2,具体策略角色

3,环境角色

如果我需要在早晨从家里出发去上班,我可以有几个策略考虑:我可以乘坐地铁,乘坐公交车,走路或其它的途径。每个策略可以得到相同的结果,但是使用了不同的资源。

代码:

<?php

abstract class baseAgent {

    //抽象策略类

abstract  function  PrintPage();

}

//用于客户端是IE时调用的类(环境角色)

class  ieAgent  extends  baseAgent {

       function  PrintPage(){

                    return 'IE';

          }

}

?>



工厂模式

工厂模式,工厂方法或者类生成对象,而不是在代码中直接new对象;

使用工厂方法,可以避免在改变某个类的名字后或则方法之后,在调用这个类的所有的代码中都修改它的名字或则参数;

test1.php

<?php

class  Test1{

    static  function  test(){

                echo  __FILE__;

        }

}

?>


Factory.php

<?php

    class  Factory{

            /**

                    如果某个类在很多文件中都  new   className(), 万一这个类的名字发生变化或则参数发生变化,

                    如果不使用工厂模式,就需要修改每一个php代码,使用了工厂模式后,就 直接修改工厂类或则

                    方法就可以了。

                **/

            static  function  createDatabase(){

                    $test = new Test1();

                    return $test;

            }

}

?>



Test.php

<?php

        spl_autoload_register('autoload1',function($class){

                   $dir = __DIR__;

                    $requireFile    =     $dir . "\\".$class.".php";

                    include $requireFile;

        });


            $test = Factory::createDatabase();

            $test -> test();

?>



注册模式

注册模式:主要用于解决全局共享和交换对象。已经创建好的对象,挂到某个全局可以使用的数组上,在需要的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方都可以访问。

<?php

 class  Register{

        protected   static   $object;

        function  set($alias , $object){  //将对象注册到树上。

                self::$object[$alias] = $object;  //将对象放树上

        }    

        static  function  get($name){

                return   self::$object[$name];   // 获取某个注册到树上的对象

        }

        function __unset($alias){

                unset(self::$object[$alias]);

        }

}

?>


观察者模式

1,当一个对象状态发生变化时候,依赖它的对象都会收到通知,并且自动更新。

2,一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。 

3:观察者模式实现了低耦合,非侵入式的通知与更新机制。


定义一个事件触发抽象类,

EventGenerator.php

<?php

    abstract    class     EventGenertor{

        private    $observers = array();

         function  addObserver(Observer  $observer){

                $this -> observers[]   =  $observer;

        }         

        function  notify(){

                foreach($this -> observers as $observer){

                        $observer -> update();

                }

        }

}

?>


定义一个观察者接口

Observer.php

interface    Observer{

        function    update();

    }


<?php

//一个实现了EventGenerator抽象类的类,用来具体定义某个事件的发生

class Event extends EventGenerator{

        function trigger(){

            echo "event";

        }

}


class Observer1  implements Observer{

        function update(){

            echo "update1 ";

        }

    }


class  Observer2 implements Observer{

        function update(){

            echo "update2";

        }

}


$event = new Event();

$event -> addObserver(new Observer1());

$event -> addObserver(new Observer2());

$event -> trigger();

$event -> notify();

?>

//当某个事件发生后,需要执行的逻辑增多时,可以以松耦合的方式去增删逻辑。

只需要定义一个实现了观察者接口的类,实现复杂的逻辑,然后在红色的部分加上一行代码即可。这样实现了低耦合。


装饰器模式 

1:装饰器模式,可以动态的添加修改类的功能 
2:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法 
3:使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。

猜你喜欢

转载自blog.csdn.net/will5451/article/details/80197919
今日推荐