设计模式学习系列——桥接模式 【设计模式】桥接模式

桥接模式

  桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。(来源百度百科)

  这个看起来很抽象,举个例子说明。有两个人,一个白领,一个运动员,两个人都有着装的需求,一个穿西服,一个穿运动服。这样正常来说,可以定一个抽象类——人,然后两个实现类白领和运动员,然后在两个实现类中各实现穿西服和穿运动服的逻辑。

  缺点:具体的人对象与着装的行为变成了强耦合关系,修改和扩展都不方便;说不定哪天白领去吃做运动,穿运动服,这时候就需要改变具体白领实现类代码。

  如果使用桥接模式呢,还是抽象出一个人类,但是呢,对着装的行为抽象出一个接口,同时定义好接口的实现类(穿西服,穿运动服等)。在这个抽象人类中组合一个着装的行为接口。当白领或者运动员继承抽象人类后,当需要着装的时候,不需要去实现里面的逻辑,只要赋予一个着装的具体实现对象即可。

  这样对应定义,将着装这部分抽象成一个接口,使得白领或者运动员无需自己实现这一接口,只要赋予一个着装的具体实现即可实现功能。两者就都可以独立的变化了。

  该模式实现了,对象与具体行为的强耦合关系的解耦,两者都能独立的变化。

  角色:

  1)行为接口类;

  2)行为接口具体实现类;

  3)抽象类;

  4)抽象实现类;

  5)使用者。

  使用前文所述的场景,代码示例如下,php编码。

<?php
/*
 * 桥接模式示例
 */
error_reporting(E_ALL);
ini_set('display_errors','on');
preg_match("/cli/i", php_sapi_name()) ? define('LINE_BREAK', PHP_EOL) : define('LINE_BREAK', "<br/>");

/*
 * 角色:行为接口
 * 穿衣打扮接口
 */
interface DressAPI{
    public function dressCloth();
}
/*
 * 角色;行为具体实现类
 * 穿西服
 */
class  DressWithSuit implements DressAPI{
    public function dressCloth(){
        echo "穿西服".LINE_BREAK;
    }
}
/*
 * 角色;行为具体实现类
 * 穿运动服
 */
class  DressWithSportsCloth implements DressAPI{
    public function dressCloth(){
        echo "穿运动服".LINE_BREAK;
    }
}

/*
 * 角色:抽象类
 * 人
 */
abstract  class Person{
    private  $_dressAPI;
    public function __construct(DressAPI $dressAPI) {
        $this->_dressAPI = $dressAPI;
    }
    public function getDressAPI(){
        return $this->_dressAPI;
    }
    public function setDressAPI(DressAPI $dressAPI){
        $this->_dressAPI = $dressAPI;
    }
    public abstract function Dress();
}

/*
 * 角色:抽象实现类
 * 白领
 */
class Officer extends Person{
    public function __construct(DressAPI $dressAPI) {
        parent::__construct($dressAPI);
        echo "我是一个白领".LINE_BREAK;
    }
    public function Dress(){
        $this->getDressAPI()->dressCloth();
    }    
}

/*
 * 角色:抽象实现类
 * 运动员
 */
class Athlete extends Person{
    public function __construct($dressAPI) {
        parent::__construct($dressAPI);
        echo "我是一个运动员".LINE_BREAK;
    }
    public function Dress(){
        $this->getDressAPI()->dressCloth();
    }    
}

/*
 * 角色:使用者
 */
$officer = new Officer(new DressWithSuit());//我是一个白领
$athlete = new Athlete(new DressWithSportsCloth());//我是一个运动员
$officer->Dress();//穿西服
$athlete->Dress();//穿运动服
$officer->setDressAPI(new DressWithSportsCloth());
$officer->Dress();//穿运动服
View Code

参考文档:

【设计模式】桥接模式

桥接模式

猜你喜欢

转载自www.cnblogs.com/Andres/p/8974032.html