随着工作积累,发现设计模式和面向对象设计原则在我们实际工作中的理论指导方面有着非常重要的作用,懂它并应用这些理论,能够很好帮助我们写出高效优雅的代码,所以,我打算做一系列这样的博客,借此对着一系列理论知识进行总结整理。
首选取我们能工作中不用不知道,一用不得了一些设计模式,并配套写个demo。
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
从桥接模式的定义或者描述我们可以总结,桥接模式是对抽象和实现进行解耦,抽象是一种行为模式的定义,实现是行为的实施。在Java的面向对象设计中,我们也可以通俗得理解为:用抽象类来定义类属性,用接口来定义类行为,用实现来完成行为,用桥接模式来将抽象和接口进行衔接。
举个例子,我们能要实现一个功能,写一个保存Hido平台的User的通用方法,人包括作者和 系统管理等等。
那么我们需要做如下几部分来实现一个简单的桥接器实例:
Talk is cheap. Show me the code
public interface UserInterface {
Object save(Object o);
}
public class HidoUserService implements UserInterface {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Object save(Object o) {
logger.info("保存平台管理人员:{}", o);
return o;
}
}
public class AuthorUserService implements UserInterface {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Object save(Object o) {
logger.info("保存作者用户:{}", o);
return null;
}
}
public abstract class BridgeAbstraction {
private UserInterface userInterface;
public UserInterface getUserInterface() {
return userInterface;
}
public void setUserInterface(UserInterface userInterface) {
this.userInterface = userInterface;
}
public Object save(Object o) {
userInterface.save(o);
return o;
}
}
public class BridgeBuilder extends BridgeAbstraction {
@Override
public Object save(Object o) {
return super.getUserInterface().save(o);
}
}
至此一个经典完整的桥接器就写完了,那我们来调用该类,进行测试效果:
加入在我的controller类中调用该类,实列话 BridgeBuilder,传入不同的UserInterface,就可以实现不同的接口调用,如下:
@RestController
@RequestMapping("/users/")
public class TUsersController {
@Autowired
private ITUsersService itUsersService;
@GetMapping("/{pageIndex}/{pageSize}")
public Object getList(@PathVariable Integer pageIndex, @PathVariable Integer pageSize) {
BridgeBuilder bridgeBuilder = new BridgeBuilder();
bridgeBuilder.setUserInterface(new AuthorUser());
bridgeBuilder.save("作者:李");
bridgeBuilder.setUserInterface(new HidoUser());
bridgeBuilder.save("平台:李");
return new Resp();
}
}
通过测试我们发现,一个桥接器,就可以灵活调用不同的接口实现。
另话,大家会想,我不用实现这个桥接器,我也可以很方便的对这两个类进行调用啊,比如在TUsersController中注入AuthorUserService和HidoUserService,为啥还非得大动干戈,写这么多节外生枝的代码,那么我问你,如果你有很多用户呢,毫无意外你会好多的接口到controller中,使用桥接器,你可以省好多功夫,这只是一个很简单的例子。还有很多场景会涉及到高度逻辑耦合或者结构冗余的情况。这时候合理使用设计模式,就可以让你的代码更加简单明了,维护方便,极易扩展。同时也可以装B。
持续学习,保持进步,我们都在路上。如有错误,请留言,我会虚心接受您的批评指正。