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