类与接口,桥接模式
周末,想起要每天搞一篇设计模式
优秀的java开发,离不开类的继承和接口的实现,但是通常选择继承还是接口有时候让人迷惑。
直到有人告诉我,类的继承属于功能性,类的接口属于实现层面,要想理解好桥接模式,就需要好好的理解了功能性和实现层面的不同。
比如 车是一个类, 宝马,奔驰不同的品牌,最好是用继承,而电动,采油,汽油车,这个属于动力实现方面,最好采用接口来实现,那么对于电动宝马,电动奔驰,怎么实现呢?
桥接模式下,就是把汽车车身做好,然后把一个电动发动机放进去,这个放进去的过程就是属于桥接。
桥接模式的精髓就在于此, 通过类的继承实现功能性的变化的封装,通过放入一个对实现的接口的引用,做到对实现方式的变化的封装。
在java中 有两个比较有名的例子来实现桥接模式,一个是 logg4j
通常,log 的子类 有 MemoryLogger, consoleLogger,NetworkLogger 等,并且他们提供的log 方法,可以有很多种formatter格式,比如 text, html, jpg。
我们在做实现的时候,不可能 实现 TextMemoryLog,HtmlMemoryLog。。。。,这会造成类的爆炸,并且对新功能的加入很麻烦。
我们做法是 在 MemoryLog,ConsoleLog 里 放入一个 Formatter的引用,通过一种组合的方式,实现两个维度的变化。
还有一个常用的例子是java 的jdbc 接口。
其实他的Connection模块就是使用 桥接模式来实现的。
Connection 下面有 MysqlConnection, OracleConnection等,每个Connection 里面又可以实现 Statement相关功能,对应MysqlStatement, OracleStatement
jdbc 里面,让Connection 里放入一个对 statement接口的引用,完成对两个维度变化的封装。
有兴趣的可以看看 这部分的代码。
对继承和接口的精确使用是关键。