zoukankan      html  css  js  c++  java
  • 设计模式学习系列——桥接模式

    桥接模式

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

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

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

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

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

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

      角色:

      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

    参考文档:

    【设计模式】桥接模式

    桥接模式

  • 相关阅读:
    数据结构-栈与队列
    数据结构-选择排序
    数据结构-冒泡排序
    数据结构-插入排序
    mysql安装最后一步不响应解决
    ScvQ常用的网站(持续更新...)
    排序算法(二)
    排序算法(一)
    原码、反码、补码
    进制转换
  • 原文地址:https://www.cnblogs.com/Andres/p/8974032.html
Copyright © 2011-2022 走看看