桥接模式将抽象部分与实现部分分离,使他们都可以独立变化。如果一个系统有两个以上相互独立的抽象变化,就需要使用桥接模式了。为说明桥接模式的使用方法,下面使用一个例子。
假设设计一个日志系统,这个系统可以记录多种日志类型,如交易日志,数据库日志,用户操作日志等,同时,这个系统还支持多种日志的表现形式。如xml文件,文本文件,数据库库数据,E-mail等。
抽象:日志的种类。
实现:日志的表现方式。
实现代码如下:
Log源代码
public abstract class Log{
protected LogSave logSave;
public Log(LogSave logSave){
this.logSave=logSave;
}
public abstract void writeToLog();
}
LogSave源代码
public abstract class LogSave{
public abstract void write();
}
下面是三个Log的子类
TradLog源代码
public class TradLog extends Log{
public TradLog(LogSave logSave){
super(logSave);
}
@Override
public void writeToLog(){
System.out.println("写入TradLog数据");
this.logSave.write();
}
}
DbLog源代码
public class DbLog extends Log{
public DbLog(LogSave logSave){
super(logSave);
}
@Override
public void writeToLog(){
System.out.println("写入DbLog数据");
this.logSave.write();
}
}
UserLog源代码
public class UserLog extends Log{
public UserLog(LogSave logSave){
super(logSave);
}
@Override
public void writeToLog(){
System.out.println("写入UserLog数据");
this.logSave.write();
}
}
下面是LogSave的三个实现类
XmlImpl源代码
public class XmlImpl extends LogSave{
@Override
public void write(){
System.out.println("使用xml方式存储");
}
}
TextImpl源代码
public class TextImpl extends LogSave{
@Override
public void write(){
System.out.println("使用文本方式存储");
}
}
EmailImpl源代码
public class EmailImpl extends LogSave{
@Override
public void write(){
System.out.println("使用发邮件的方式存储");
}
}
实现不能和抽象发生耦合,而只能由抽象和实现发生耦合。
下面是启动类展示最终结果:
Client源代码
public class Client{
public static void main(String[] args){
Log log=new UserLog(new XmlImpl());
log.writeToLog();
Log log2=new DbLog(new EmailImpl());
log2.writeToLog();
}
}
运行结果如下:
写入UserLog数据
使用xml方式存储
写入DbLog数据
使用发邮件的方式存储
(end)
转载于:https://blog.51cto.com/secondscript/1604797