桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
假如我们需要建立一个日志记录器,可以实现数据库记录和文本记录。根据我们的经验我们应该将日志记录抽象化,在分别用数据库记录和文本记录来实现具体的功能。
后来我们需要将他分别应用到net平台和java平台,考虑到不同平台的记录不同我们分别将数据库记录细化为net平台上的数据库机记录和java平台上的数据库记录。以及不同的文本记录。
在后来我们打算添加xml平台以及更多的平台进去。
现在发现我们的设计变得庞大脆弱,即便平台不同但总有相似之处,这其中的冗余代码会有很多。
假如我们不止沿着平台这一方向扩展呢。
因此我们需要使用桥接模式进行更加合理的设计。
桥接模式将抽象部分与他的实现部分分离,使他们都可以独立的变化。
抽象化:多个实体中共同的概念性联系。如:日志记录
实现化:抽象化的具体实现。如:在Net平台上进行数据库日志记录。
我们可以进行如下设计:
桥接类:
抽象日志
1 public abstract class log { 2 private ImpLog impLog; 3 4 public log(ImpLog impLog) { 5 super(); 6 this.impLog = impLog; 7 } 8 9 abstract public void write(String log); 10 11 public ImpLog getImpLog() { 12 return impLog; 13 } 14 15 public void setImpLog(ImpLog impLog) { 16 this.impLog = impLog; 17 } 18 }
实现化角色:
抽象平台
1 public abstract class ImpLog { 2 3 abstract public void execute(String msg); 4 5 }
具体实现化角色:
java平台
1 public class JImpLog extends ImpLog{ 2 3 @Override 4 public void execute(String msg) { 5 System.out.println("在java平台上," + msg); 6 } 7 8 }
net平台
1 public class NImpLog extends ImpLog{ 2 3 @Override 4 public void execute(String msg) { 5 System.out.println("在Net平台上,"+msg); 6 7 } 8 9 }
桥接具体类:
数据库日志:
public class DataBaseLog extends log{ public DataBaseLog(ImpLog impLog) { super(impLog); } @Override public void write(String log) { getImpLog().execute("数据库日志:" + log); } }
文本文件日志
1 public class TextFileLog extends log{ 2 3 public TextFileLog(ImpLog impLog) { 4 super(impLog); 5 } 6 7 @Override 8 public void write(String log) { 9 getImpLog().execute(log); 10 } 11 12 }
客户测试类:
1 public class BridgePattern { 2 3 public static void main(String[] args) { 4 ImpLog j= new JImpLog();//建立java平台 5 log jl = new DataBaseLog(j);//建立基于java 的数据库日志写入 6 jl.write(" I am fine!"); //写入日志文件 7 8 9 } 10 11 }