桥接模式将抽象部分与实现部分分离,使他们都可以独立变化。如果一个系统有两个以上相互独立的抽象变化,就需要使用桥接模式了。为说明桥接模式的使用方法,下面使用一个例子。

    假设设计一个日志系统,这个系统可以记录多种日志类型,如交易日志,数据库日志,用户操作日志等,同时,这个系统还支持多种日志的表现形式。如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)