桥接模式的定义:
桥接模式又叫作桥梁模式、接口模式或柄体模式,指将抽象部分与具体实现部分分离,使它们都可以独立的变化,属于结构性模式。
桥接模式的主要目的是通过组合的方式建立两个类之间的联系,而不是继承,但又类是多重继承方案。但是多重继承方案往往违背了类
的单一职责原则,其复用性比较差,桥接模式是比多重继承方案更好的替代方案。桥接模式的核心在于把抽象与实现解耦。
桥接模式的运用场景:
- 在抽象和具体实现之间需要增加更多灵活性的场景。
- 一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展。
- 不希望使用继承,或因为多继承导致系统类的个数剧增。
使用桥接模式设计稍复杂得消息系统:
具给例子,我们在平时办公得时候经常通过邮件消息、短信消息、或者系统内消息与同时进行沟通。消息又会有紧急程度之分,分为
普通消息、加急消息和特急消息。显然,整个消息系统可以划分为两个维度,下面我们来看看通过桥接模式如何解决这个问题,先创建一个
IMessage接口担任桥接的角色类。
public interface IMessage { //发送消息的内容和接收人 void send(String message,String toUser); }
创建邮件消息实现类EmailMessage类。
class EmailMessage implements toUser); } }
创建短线消息实现类SmsMessage类。
class SmsMessage toUser); } }
创建桥接抽象角色AbastractMessage类。
abstract class AbastractMessage { private IMessage message; public AbastractMessage(IMessage message) { this.message = message; } sendMessage(String message,String toUser){ this.message.send(message,toUser); } }
创建具体实现普通消息NomalMessage类。
public class NomalMessage extends AbastractMessage {
public NomalMessage(IMessage message) {
super(message);
}
void sendMessage(String message,String toUser){
message = "【普通】" + message;
super.sendMessage(message,toUser);
}
}
创建具体实现加急消息UrgencyMessage类。
class UrgencyMessage extends UrgencyMessage(IMessage message) { super(message); } message; .sendMessage(message,toUser); } Object watch(String messageId){ return null; } }
测试代码。
Test { static main(String[] args) { IMessage message = new SmsMessage(); AbastractMessage abastractMessage = NomalMessage(message); abastractMessage.sendMessage("加班申请","王总"); message = EmailMessage(); abastractMessage = UrgencyMessage(message); abastractMessage.sendMessage("加班申请",1)">); } }
测试结果如下:
来看看对应的UML类图:
由上图可以看到,桥接模式主要包含4个角色.
- 抽象(AbastractMessage):该类持有一个对实现角色(IMessage)的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现实例)。
- 修正抽象(UrgencyMessage和NomalMessage); 抽象的具体实现,对抽象的方法进行完善和扩展。
- 实现(IMessage):确定实现维度的基本操作,提供给抽象使用。该类一般为接口或者抽象类。
- 具体实现(EmailMessage和UrgencyMessage):实现的具体实现。
桥接模式的优点:
- 分离抽象部分及其具体实现部分。
- 提高了系统的扩展性。
- 符合开闭原则。
- 符合合成复用原则。
桥接模式的缺点:
- 增加了系统的理解与设计难度。
- 需要正确地识别系统中两个独立变化的维度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。