深入Java设计模式之桥接模式
2023-09-11 14:20:01 时间
引入
JDBC是以统一方式访问数据库的API.是一种退化的桥接模式
它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracle数据库专门写一个程序,为访问Sybase数据库又专门写一个程序等等,只需要用JDBC API写一个程序就够了,它可以向相应数据库发送SQL调用.JDBC是Java应用程序与各种不同数据库之间进行对话的方法的机制.
桥接模式原理
系统有多维角度分类时,而每一种分类又有可能变化,考虑使用桥接模式 桥接的目的是分离抽象与实现,使抽象和实现可以独立变化。
桥接模式的优点
(1)实现了抽象和实现部分的分离
桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
(2)更好的可扩展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。
(3)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
(4)实现细节对客户端透明,可以对用户隐藏实现细节。
桥接模式的缺点
(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
使用桥梁模式的场景
不用桥接模式的写法
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public interface Message
{
public void send(String message, String toUser);
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public interface UrgencyMessage extends Message
{
public Object monitor(String messageId);
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class UrgencyMessageSMS implements UrgencyMessage
{
public Object monitor(String messageId)
{
return null;
}
public void send(String message, String toUser)
{
message = "加急:" + message;
System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class UrgencyMessageEmail implements UrgencyMessage
{
public Object monitor(String messageId)
{
return null;
}
public void send(String message, String toUser)
{
message = "加急:" + message;
System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class CommonMessageSMS implements Message
{
public void send(String message, String toUser)
{
System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessage;
public class CommonMessgaeEmail implements Message
{
public void send(String message, String toUser)
{
System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser);
}
}
用桥接模式的写法:
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class ClientForOAMessageBridge
{
public static void main(String[] args)
{
MessageImplementor messageImplementor = new MessageSMS();
AbstractMessage message = new CommonMessage(messageImplementor);
message.sendMessage("请喝杯茶", "小李");
message = new UrgencyMessage(messageImplementor);
message.sendMessage("请喝杯茶", "小李");
message = new SpecialUrgencyMessage(messageImplementor);
message.sendMessage("请喝杯茶", "小李");
messageImplementor = new MessageMobile();
message = new CommonMessage(messageImplementor);
message.sendMessage("请喝杯茶", "小李");
message = new UrgencyMessage(messageImplementor);
message.sendMessage("请喝杯茶", "小李");
message = new SpecialUrgencyMessage(messageImplementor);
message.sendMessage("请喝杯茶", "小李");
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public abstract class AbstractMessage
{
protected MessageImplementor impl;
protected AbstractMessage(MessageImplementor impl)
{
this.impl = impl;
}
public void sendMessage(String message, String toUser)
{
this.impl.send(message, toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class SpecialUrgencyMessage extends AbstractMessage
{
protected SpecialUrgencyMessage(MessageImplementor impl)
{
super(impl);
}
public void hurry(String messageId)
{
}
public void sendMessage(String message, String toUser)
{
message = "特急:" + message;
super.sendMessage(message, toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class CommonMessage extends AbstractMessage
{
protected CommonMessage(MessageImplementor impl)
{
super(impl);
}
public void sendMessage(String message, String toUser)
{
super.sendMessage(message, toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public interface MessageImplementor
{
public void send(String message, String toUser);
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class MessageMobile implements MessageImplementor
{
public void send(String message, String toUser)
{
System.out.println("使用手机短消息的方法,发送消息 '" + message + "' 给 " + toUser);
}
}
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge;
public class MessageSMS implements MessageImplementor
{
public void send(String message, String toUser)
{
System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser);
}
}
示例代码
相关文章
- java设计模式2--抽象工厂模式(Abstract Factory)
- java设计模式4--建造者模式(Builder)
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- 【JAVA】 01-Java基础知识
- 【java设计模式】之 抽象工厂(Abstract Factory)模式
- 【java设计模式】之 建造者(Builder)模式
- JAVA转换器模式 耳机口转Type-C
- Java设计模式之建造者Builder模式代码示例
- Java设计模式之享元flyweight模式代码示例
- Java设计模式之观察者Observer模式代码示例
- Java设计模式之策略模式与状态模式
- Java设计模式之《观察者模式》及应用场景
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
- ABAP和Java里的单例模式攻击
- Atitit 搜索蓝牙设备 powershell的实现 java noede.js python 先用脚本语言python nodejs,不好实现。。Java 也不好实现。。 Netcore可以,
- Atitit webshell java 实现 命令行输出读取问题总结 1.1. 读取组赛 或者读取了一部分。。使用cmd /c 模式,强制关闭刷新缓冲区1 1.2. 乱码解决1 1.3. /h
- 熬夜学Java语言-设计模式之代理模式
- Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
- 【java】Java中-> 是什么意思?
- 【Java用法】java 8两个List集合取交集、并集、差集、去重并集
- 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略
- Java Logger(java日志)
- java责任链模式
- 频繁模式挖掘apriori算法介绍及Java实现
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
- Java模式(适配器型号)
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
- Java工厂模式
- Java开发篇——设计模式(2)单例模式你真的了解吗?
- Java组合模式:如何通过对象组合实现更高效的代码设计