桥接模式(Bridge、Implementor)(具体不同平台日志记录,抽象与实现分离)

 桥接模式(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 }

 

posted @ 2017-08-03 18:59  千彧  阅读(757)  评论(0编辑  收藏  举报