设计模式-桥接模式
模式介绍
桥接模式用于分离要做的功能和具体实现,从而让各个模块独立出来。接下来我们看一个例子,假如我们有一个机器人,这个机器人能够动手指,能够跑步,以及思考。假如我们不用桥接模式,普通的写法就是把动手指的实现写到和机器人写到同一个类里面,这样的话,以后我们要调整实现的话,每次都要修改机器人里面关于动手指的实现。假如我们还有动脚指头的实现,也在机器人类里面,这样每次修改这些模块的实现都要去机器人类里面,很明显,这样不便于后面的拓展。如果我们用接口定义出来要实现的功能,然后再写个类来实现呢?这样就实现了要做的功能和具体实现的分离,调用者只关心供应方提供的功能,然后调用就行了,并不需要关心具体的实现。供应方功能需要改变的话,直接修改实现就行了,接下来我们来看代码
类间关系
代码实现
零件的接口
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
信息: 我开始走了,我就随便走走
一些总结
这里功能接口和实现分离开了,调用者直接通过接口来调用,接口供应方来进行实现