咱们以手机为例,手机有品牌(诺基亚、摩托罗拉)和样式(折叠式、直立式),咱们须要生产不一样的品牌和样式,好比折叠式诺基亚、直立式摩托罗拉... ...java
「抽象」 - 手机品牌,都有开机和关机的功能数据库
public interface PhoneBrand { void open(); void close(); }
「具体」 - 手机品牌 Nokia 和 Moto编程
public class Nokia implements PhoneBrand { @Override public void open() { System.out.println("诺基亚开机..."); } @Override public void close() { System.out.println("诺基亚关机..."); } }
public class Moto implements PhoneBrand { @Override public void open() { System.out.println("摩托罗拉开机..."); } @Override public void close() { System.out.println("摩托罗拉关机..."); } }
「抽象」 - 手机类,以聚合的方式与品牌产生联系,充当着“桥”的角色设计模式
public abstract class AbsPhone{ private PhoneBrand brand; public AbsPhone(PhoneBrand brand) { this.brand = brand; } protected void open(){ brand.open(); } protected void close(){ brand.close(); } }
「具体」 - 折叠式手机 和 直立式手机ide
public class FoldingPhone extends AbsPhone{ public FoldingPhone(PhoneBrand brand) { super(brand); } @Override protected void open() { System.out.print("折叠式 - "); super.open(); } @Override protected void close() { System.out.print("折叠式 - "); super.close(); } }
public class UpRightPhone extends AbsPhone{ public UpRightPhone(PhoneBrand brand) { super(brand); } @Override protected void open() { System.out.print("直立式 - "); super.open(); } @Override protected void close() { System.out.print("直立式 - "); super.close(); } }
测试测试
@Test public void test(){ AbsPhone p1 = new FoldingPhone(new Nokia()); p1.open(); p1.close(); System.out.println(); AbsPhone p2 = new UpRightPhone(new Moto()); p2.open(); p2.close(); }
结果this
折叠式 - 诺基亚开机... 折叠式 - 诺基亚关机... 直立式 - 摩托罗拉开机... 直立式 - 摩托罗拉关机...
若是咱们想建立其余类型的手机,只须要改变建立方式便可。url
在 Java 中咱们一般使用 JDBC 链接数据库,可是数据库的种类有不少(MySQL、Oracle...),它们的链接方式、协议都不尽相同,很显然不能为每种数据库都写一个接口,这样就违背了精简设计原则,因而Java设计师就提供一套接口给厂商们本身实现,一套接口给用户调用。设计
咱们在使用 JDBC 的时候须要写这样的代码code
Class.forName("数据库驱动名"); Connection conn = DriverManager.getConnection("数据库url", "用户名", "密码");
其过程是这样的:
Class.forName()
的时候,经过反射机制,将 .class
文件加载进Java虚拟机内存中,Driver
类初始化,执行如下代码,向 DriverManager
中注册一个驱动。DriverManager
是个 Driver
容器,管理不一样的 Driver
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
咱们获取链接时,DriverManager
就会根据驱动返回一个相应的数据库链接
@CallerSensitive public static Connection getConnection(String url, java.util.Properties info) throws SQLException { return (getConnection(url, info, Reflection.getCallerClass())); }
对于那些不但愿使用继承或由于多层次继承致使系统类的个数急剧增长的系统,桥接模式尤其适用。