PHP设计模式-适配器模式

适配器模式

参考自:http://blog.csdn.net/wzllai/article/details/7832815

适配器模式,可以将截然不同的函数接口封装成统一的API;
适配器模式将一个类的接口,转换成客户期望的另一个接口;
是的原本由于接口不兼容无法一起工作的类可以一起工作;解决兼容性;
透明:通过适配器,客户端可以调用同一个接口,因而对客户端来说是透明的,这样做更简单、更直接、更紧凑。
重用:复用了现存的类,解决了现存类和复用环境要求不一致的问题。
低耦合:将目标类和适配者类解耦,通过引入一个适配器类重用现用的适配者类,而无需修改原有代码。(遵循开闭原则)

应用场景:

PHP的数据库操作有mysql,mysqli,pdo3种,可以用适配器模式统一成一致。类似的像memcache,redis,file,apc等不同的缓存函数统一成一致;适配器作为一个中间层来实现不同功能转换。适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。

类适配器:(使用继承方式实现)

client类最终面对的是Target接口(或者抽象类),它只能使用符合这个标准的子类(Adapter)。
类适配器(Adapter)继承原有的Adaptee类,自己实现原有类没有的操作,从而达到适配。client可以透明调用Adaptee中的特殊功能。

    interface ITarget  
        {  
            function operation1();  
            function operation2();  
        }  

        interface IAdaptee  
        {  
            function operation1();  
        }  

        class Adaptee extends IAdaptee  
        {  
            public  function operation1()  
            {  
                echo "原方法";  
            }  
        }  

        class Adapter extends Adaptee implements IAdaptee, ITarget  
        {  
            public  function operation2()  
            {  
                echo "适配方法";  
            }  
        }  

        class Client  
        {  
            public  function test()  
            {  
                $adapter = new Adapter();  
                $adapter->operation1();//原方法  
                $adapter->operation2();//适配方法  
            }  
        }  

对象适配器:(使用组合模式实现)

将adaptee作为adapter的一个引用。用该引用来调用所有adaptee中的方法。同时adapter实现客户期望的接口,达到适配。
由于组合在耦合性小于继承,对象适配器更加灵活。缺点就是增加代码量,需要重写adapee中的方法量。

    interface ITarget  
            {  
            function operation1();  
            function operation2();  
            }  

            interface IAdaptee  
            {  
            function operation1();  
            }  

            class Adaptee extends IAdaptee  
            {  
            public  function operation1()  
            {  
            echo "原方法";  
            }  
            }  

            class Adapter implements  ITarget  
            {  
            private $adaptee;  

            public function __construct($adaptee)  
            {  
            $this->adaptee = $adaptee;  
            }  

            public  function operation1()  
            {  
             return $this->adaptee->operation1();  
            }  

            public  function operation2()  
            {  
            echo "适配方法";  
            }  
            }  


            class Client  
            {  
            public  function test()  
            {  
            $adapter = new Adapter(new Adaptee(null));  
            $adapter->operation1();//原方法  
            $adapter->operation2();//适配方法  
            }  
            }  
            //如果adapee中的方法量比较大的话,可以考虑再adapter中使用__call方法来委托取得客户端调用的方法。
            public function __call($func, $args)  
            {  
            if (is_callable(array($this->adaptee, $func))) {  
            return $this->adaptee->$func($args);  
            }  
            trigger_error('*********', E_USER_ERROR);  
            }  

未完待续……….

你可能感兴趣的:(设计模式)