php抽象类简单实现策略模式

abstract修饰符可以和类、方法、属性、索引器及事件一起使用。
在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。
标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
抽象类不能被实例化。

<?php
/*
* 飞行接口
*/
abstract class InterfaceFly{
    abstract function fly();
    public function getInstance($interfaceFly){
        return new $interfaceFly;
    }
}
/*
* 飞行接口实现方法
*/
class FlyWithWind extends InterfaceFly{
    public function fly(){
        echo "我用翅膀飞行";
    }
}

class FlyWithFoot extends InterfaceFly{
    public function fly(){
        echo "我用脚飞行";
    }
}

/*
* 叫接口
*/
abstract class InterfaceQuack{
    abstract function quack();
    public function getInstance($interfaceQuack){
        return new $interfaceQuack;
    }
}
/*实现叫的接口*/
class QuackJiji extends InterfaceQuack {
    public function quack(){
        echo "我叽叽叫";
    }    
}
class QuackGuagua extends InterfaceQuack {
    public function quack(){
        echo "我呱呱叫";
    }
}


//主类
class Duck{
    private $_fly;//用于保存duck的实例
    private $_quack;
    public $_interfaceFly = "FlyWithFoot";
    public $_interfaceQuack = "QuackGuagua";

    public function __construct($interfaceFly,$interfaceQuack){
        if(!empty($interfaceFly)){
            $this->_interfaceFly = $interfaceFly;    
        }
        //实例化飞行接口
        $this->_fly = InterfaceFly::getInstance($this->_interfaceFly);

        if(!empty($interfaceQuack)){
            $this->_interfaceQuack = $interfaceQuack;
        }
        //实例化叫接口
            $this->_quack = InterfaceQuack::getInstance($this->_interfaceQuack);
    }

    //飞行方法
    public function fly(){
        $this->_fly->fly();
    }
    //鸭子叫的方法
    public function quack(){
        $this->_quack->quack();
    }
}


$duck = new Duck();
$duck->fly();
echo "\n";
$duck->quack();


?>

 

类图没有画,大家慢慢感觉一下。参考至java版的策略设计模式。

这里使用了abstract来代替interface做接口处理。

posted @ 2013-06-14 11:58  feiyuhit  阅读(187)  评论(0编辑  收藏  举报