設計模式-橋接模式

設計模式-橋接模式

模式介紹

橋接模式用於分離要做的功能和具體實現,從而讓各個模塊獨立出來。接下來我們看一個例子,假如我們有一個機器人,這個機器人能夠動手指,能夠跑步,以及思考。假如我們不用橋接模式,普通的寫法就是把動手指的實現寫到和機器人寫到同一個類裏面,這樣的話,以後我們要調整實現的話,每次都要修改機器人裏面關於動手指的實現。假如我們還有動腳指頭的實現,也在機器人類裏面,這樣每次修改這些模塊的實現都要去機器人類裏面,很明顯,這樣不便於後面的拓展。如果我們用接口定義出來要實現的功能,然後再寫個類來實現呢?這樣就實現了要做的功能和具體實現的分離,調用者只關心供應方提供的功能,然後調用就行了,並不需要關心具體的實現。供應方功能需要改變的話,直接修改實現就行了,接下來我們來看代碼

類間關係

在這裏插入圖片描述

代碼實現

零件的接口

public interface IPart {
    /**
     * 打印信息
     * */
    void printInfo();
}

手的接口

public interface IHand extends IPart{
    void wigglingFingers();
}

一個實現了手接口的實現類

public class XXHand implements IHand {
    private Logger logger=Logger.getLogger(XXHand.class.getSimpleName());
    @Override
    public void wigglingFingers() {
        logger.info("我開始扭動我的手指");
    }

    @Override
    public void printInfo() {
        logger.log(Level.INFO,"我是一個機械臂,我很靈活");
    }
}

腳的接口

public interface IFoot extends IPart{
    /**
     * 獲得腿的最大跑步速度
     * @return
     */
    Double getMaxRunSpeed();

    /**
     * 開始跑步
     */
    void startRun();
}

一個實現了腳接口的實現類

public class XXFoot implements IFoot {
    private Logger logger=Logger.getLogger(XXFoot.class.getSimpleName());
    @Override
    public Double getMaxRunSpeed() {
        return 300D;
    }

    @Override
    public void startRun() {
        for(;;){
            try {
                Thread.sleep(200);
                logger.log(Level.INFO    ,"我開始走了,我就隨便走走");
            } catch (Exception e) {
                logger.info(e.getMessage());
            }
        }
    }

    @Override
    public void printInfo() {
        logger.log(Level.INFO,"這是一個鈦合金腳,踢開椰子只要一腳");
    }
}

頭的接口

public interface IHead extends IPart{
    void doThinking();
}

一個實現了頭接口的實現類

public class XXHead implements IHead {
    private Logger logger=Logger.getLogger(XXHead.class.getSimpleName());

    @Override
    public void printInfo() {
        logger.log(Level.INFO,"我是一個頭,我有自我意識");
    }

    @Override
    public void doThinking() {
        logger.log(Level.INFO,"我在考慮怎麼毀滅地球");
    }
}

機器人接口

public interface IRobot {
    void insertHands(IHand hand);
    void insertFoot(IFoot foot);
    void insertHead(IHead head);

    void startMove();
    void startThinking();
    void startHand();
}

一個實現了機器人接口的實現類

public class XXRobot implements IRobot {
    private Logger logger=Logger.getLogger(XXRobot.class.getSimpleName());
    private IHand hand;
    private IFoot foot;
    private IHead head;

    @Override
    public void insertHands(IHand hand) {
        this.hand=hand;
    }

    @Override
    public void insertFoot(IFoot foot) {
        this.foot=foot;
    }

    @Override
    public void insertHead(IHead head) {
        this.head=head;
    }

    @Override
    public void startMove() {
        if(foot!=null){
            Double maxRunSpeed = foot.getMaxRunSpeed();
            logger.log(Level.INFO,"最大速度:->"+maxRunSpeed);
            foot.startRun();
        }
    }

    @Override
    public void startThinking() {
        if(head!=null){
            head.doThinking();
        }
    }

    @Override
    public void startHand() {
        if(hand!=null){
            hand.wigglingFingers();
        }
    }
}

接下來看一下測試代碼

public class Content {
    public static void main(String[] args) {
        XXRobot robot=new XXRobot();
        robot.insertFoot(new XXFoot());
        robot.insertHands(new XXHand());
        robot.insertHead(new XXHead());
        robot.startHand();
        robot.startThinking();
        robot.startMove();
    }
}

output:

七月 17, 2019 6:08:42 下午 bridgemode.XXHand wigglingFingers
信息: 我開始扭動我的手指
七月 17, 2019 6:08:42 下午 bridgemode.XXHead doThinking
信息: 我在考慮怎麼毀滅地球
七月 17, 2019 6:08:42 下午 bridgemode.XXRobot startMove
信息: 最大速度:->300.0
七月 17, 2019 6:08:42 下午 bridgemode.XXFoot startRun
信息: 我開始走了,我就隨便走走
七月 17, 2019 6:08:42 下午 bridgemode.XXFoot startRun
信息: 我開始走了,我就隨便走走

一些總結

這裏功能接口和實現分離開了,調用者直接通過接口來調用,接口供應方來進行實現

完整代碼可以去我的GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章