核心思想在于抽象部分和实现部分分离
以下实现三种常见的发送消息的方式:站内信、短信(SMS)、邮件。而假如系统中的消息又需要按照紧急程度来划分普通消息和加急消息
public interface IMessage {
void send(String content,String toUser);//发送消息
}
public class SmsMessage implements IMessage {
@Override
public void send(String content, String toUser) {
System.out.println(String.format("SMS消息->%s:%s",toUser,content));
}
}
public class EmailMessage implements IMessage {
@Override
public void send(String content, String toUser) {
System.out.println(String.format("邮件消息->%s:%s",toUser,content));
}
}
public class WebMessage implements IMessage {
@Override
public void send(String content, String toUser) {
System.out.println(String.format("站内消息->%s:%s",toUser,content));
}
}
//桥接者类
public abstract class AbstractBridgeMessage {
private IMessage iMessage;//持有抽象维度的引用
public AbstractBridgeMessage(IMessage iMessage) {
this.iMessage = iMessage;
}
public void sendMessage(String content,String toUser){//定义一个和抽象维度类中具有相同功能的方法:发送消息
this.iMessage.send(content,toUser);//调用抽象维度内方法:发送消息
}
}
//普通消息
public class CommonMsg extends AbstractBridgeMessage {
public CommonMsg(IMessage iMessage) {
super(iMessage);
}
@Override
public void sendMessage(String content, String toUser) {
this.doSomething();//做一点普通消息该做的事
super.sendMessage(content, toUser);//调用桥接者中的方法:发送消息
}
private void doSomething() {
System.out.println("我只是一个普通消息,什么都不用做");
}
}
//紧急消息
public class UrgentMessage extends AbstractBridgeMessage {
public UrgentMessage(IMessage iMessage) {
super(iMessage);
}
@Override
public void sendMessage(String content, String toUser) {
doSomething();//做点紧急消息需要做的事情
super.sendMessage(content, toUser);//调用桥接者中的方法:发送消息
}
private void doSomething() {
System.out.println("这是紧急消息,请优先发送");
}
}
public class TestBridge {
public static void main(String[] args) throws IOException {
IMessage iMessage = new EmailMessage();
AbstractBridgeMessage abstractBridgeMessage = new UrgentMessage(iMessage);//紧急邮件消息
abstractBridgeMessage.sendMessage("您好","双子孤狼1号");
//再来一个普通短信消息
System.out.println("------------分割线---------------");
iMessage = new SmsMessage();
abstractBridgeMessage = new CommonMsg(iMessage);
abstractBridgeMessage.sendMessage("您好","双子孤狼2号");
//最后再来一个紧急的站内信
System.out.println("------------分割线---------------");
iMessage = new WebMessage();
abstractBridgeMessage = new UrgentMessage(iMessage);
abstractBridgeMessage.sendMessage("您好","小伙伴");
}
}
适用场景
一个类存在两个以上的纬度,而且分别都需要扩展时
优点
提高拓展性,符合开闭原则,符合复用原则
缺点
类多,复杂