
写在前面
桥接模式:将抽象与实现分离,使它们可以独立变化。它是用组合/聚合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
使用场景1:要绘制矩形、圆形、椭圆、正方形,绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,我们可以设计颜色和形状两个变化维度:
我们设计一个抽象化角色"颜色",然后让红色、绿色、蓝色统一继承自"颜色",让矩形、圆形、椭圆、正方形统一继承自一个接口"形状"。"颜色"的构造方法中传入"形状"这个接口,这样"颜色"和"形状"就桥接起来了
使用场景2:手机、电脑、电视都需要接收消息,消息又分为紧急消息、普通消息,这时候我们就可以把"系统"和"消息"抽象出来桥接。如下有具体实现代码
1、桥接模式实例
以不同的系统需要接收不同的消息为例
1.1、消息类
抽象消息类
public abstract class AbstractMessage { //持有一个实现部分的对象 MessageImplementor impl; public AbstractMessage(MessageImplementor impl){ this.impl = impl; } /** * 发送消息,委派给实现部分的方法 * @param message 要发送消息的内容 * @param toUser 消息的接受者 */ public void sendMessage(String message , String toUser){ this.impl.send(message, toUser); }}
普通消息
public class CommonMessage extends AbstractMessage { public CommonMessage(MessageImplementor impl) { super(impl); } @Override public void sendMessage(String message, String toUser) { // 对于普通消息,直接调用父类方法,发送消息即可 super.sendMessage(message, toUser); }}
紧急消息
public class UrgencyMessage extends AbstractMessage { public UrgencyMessage(MessageImplementor impl) { super(impl); } @Override public void sendMessage(String message, String toUser) { message = "加急:" + message; super.sendMessage(message, toUser); } /** * 扩展自己的新功能,监控某消息的处理状态 * @param messageId 被监控的消息编号 * @return 监控到的消息的处理状态 */ public Object watch(String messageId) { // 根据消息id获取消息的状态,组织成监控的数据对象,然后返回 return null; }}
1.2、系统类
系统接口
public interface MessageImplementor { /** * 发送消息 * @param message 要发送消息的内容 * @param toUser 消息的接受者 */ public void send(String message , String toUser);}
手机
public class Phone implements MessageImplementor { @Override public void send(String message, String toUser) { System.out.println("使用系统内短消息的方法,发送消息'"+message+"'给"+toUser); } }
电脑
public class Pc implements MessageImplementor { @Override public void send(String message, String toUser) { System.out.println("使用邮件短消息的方法,发送消息'"+message+"'给"+toUser); } }
1.3、使用
public class Client { public static void main(String[] args) { // 手机发送 MessageImplementor impl = new Phone(); AbstractMessage message = new CommonMessage(impl); message.sendMessage("加班申请速批--来自手机","李总"); // 电脑发送 impl = new Pc(); message = new UrgencyMessage(impl); message.sendMessage("加班申请速批---来自电脑","李总"); } }
2、JDBC
在java中jdbc是使用桥接模式实现的
2.1、jdbc连接实例
import java.sql.*; public class JdbcTest { public static void main(String[] args) throws ClassNotFoundException, SQLException{ // 需要导入mysql-connector-java-8.0.27.jar,数据库test、用户名root,密码root Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root"); PreparedStatement ps = conn.prepareStatement("SELECT * FROM user"); ResultSet rs = ps.executeQuery(); if (rs.next()) { System.out.println("id :"+rs.getInt("id")+",name :"+rs.getInt("id")); } rs.close(); ps.close(); }}