面向接口编程和面向实现编程

面向接口表示子类是实现接口或者抽象类,面向实现表示继承普通类。

明显前者耦合比较低,因修改代码比较低,因为接口和抽象类本身有的方法不干事情,而是子类去去实现。

设计原则:

找出应用对象中可能需要变化的部分,把它们独立出来,不要跟不变化的放在一起。

面向实现方式用例:

//面向实现编程
/**
 * 普通类animal
 */
class animal
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
        echo $this->name.":\n";
    }

    public function eat()
    {
    }

    public function run()
    {
    }
}

/**
 * 子类dog
 */
class dog extends animal
{
    public function eat()
    {
        //狗用嘴吃饭
        echo " eat with mouth\n";
    }

    public function run()
    {
        //狗用四根腿跑路
        echo " run with four legs\n";
    }
}

/**
 * 子类bear
 */
class bear extends animal
{
    public function eat()
    {
        //狗熊用嘴和手吃饭
        echo " eat with mouth and hands\n";
    }

    public function run()
    {
        //狗熊用两根腿跑路
        echo " run with two legs\n";
    }
}

/**
 * 测试类
 */
class testDriver{
    public function test(){
        $dog = new dog('Dog');
        $dog->eat();
        $dog->run();
        $bear = new bear('Bear');
        $bear->eat();
        $bear->run();
    }
}
$test = new testDriver();
$test->test();



面向实现方式UML:


输出:


面向接口方式用例:

//面向接口编程
/**
 * interface:吃
 */
interface eatBehavior {
   public function eat();
}

/**
 * 狗吃
 */
class dogEat implements eatBehavior{
    public function eat(){
        echo " eat with mouth\n";
    }
}

/**
 * 熊吃
 */
class bearEat implements eatBehavior
{
    public function eat()
    {
        echo " eat with mouth and hands\n";
    }
}

/**
 * interface:跑
 */
interface runBehavior
{
    public function run();
}

/**
 * 狗跑
 */
class dogRun implements runBehavior
{
    public function run()
    {
        echo " run with four legs\n";
    }
}
/**
 * 熊跑
 */
class bearRun implements runBehavior
{
    public function run()
    {
        echo " run with two legs\n";
    }
}
/*
 * 狗类
 */
class animal
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
        echo $this->name . ":\n";
    }
}
class dog  extends animal{
    public $runBehavior;
    public $eatBehavior;
    public function __construct($name){
        parent::__construct($name);
        $this->runBehavior = new dogRun();
        $this->eatBehavior = new dogEat();
    }
    public function eat(){
        $this->eatBehavior->eat();
    }
    public function run(){
        $this->runBehavior->run();
    }
}

class bear extends animal
{
    public $runBehavior;
    public $eatBehavior;

    public function __construct($name)
    {
        parent::__construct($name);
        $this->runBehavior = new bearRun();
        $this->eatBehavior = new bearEat();
    }

    public function eat()
    {
        $this->eatBehavior->eat();
    }

    public function run()
    {
        $this->runBehavior->run();
    }
}

/**
 * 测试类
 */
class testDriver
{
    public function test()
    {
        $dog = new dog('Dog');
        $dog->eat();
        $dog->run();
        $bear = new bear('Bear');
        $bear->eat();
        $bear->run();
    }
}

$test = new testDriver();
$test->test();
面向接口编程UML:


输出:


小节:

进行面向接口编程重构之后,类的数目明显变多,但是这实现的动物animal与吃eat、跑run的轻松解耦合。如果要实现爬、滚、吼之类的动物行为,没必要修改动物类Class animal代码,只需定义新的接口类即可。


********************************************

* 作者:叶文涛 

* 标题:面向接口编程和面向实现编程

* 时间:2012-5-13

* 参考:

*《Head First设计模式》Eric Freeman等著

******************转载请注明来源 ***************



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值