面向接口表示子类是实现接口或者抽象类,面向实现表示继承普通类。
明显前者耦合比较低,因修改代码比较低,因为接口和抽象类本身有的方法不干事情,而是子类去去实现。
设计原则:
找出应用对象中可能需要变化的部分,把它们独立出来,不要跟不变化的放在一起。
面向实现方式用例:
//面向实现编程
/**
* 普通类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等著
******************转载请注明来源 ***************