桥接模式(完全理解此模式)
GOF取的名字,有时候名字比模式本身更难懂。 有的如模板模式,都不用看代码,就知道这个模式是做什么的。
而这个bridge,。。看名字,无法知道它想做什么。 无语。看了几次,没看懂。今天看懂了,发现以前用过很多次了。
一句话就是 虚类的虚方法里面又调用了接口的方法,用接口的多态和虚函数的多态来组合多个需要变化的部分,来完成一些特定的场景。
其实这个不是固定的。个人感觉完全可以一个虚函数,合并n个接口。或者 多个虚函数组合多个接口。或者直接多个虚函数不需要接口也可以完成桥接的目的。
反正目的就是把变化点都独立变化。之后再组合。这样可以组合成很多不同的对象。
自己的例子,是一个不举模式。但是我确实是用它来实现一个打印信息的模板。 它就是一个自由模板啊。
个人总结。非常常用实用。
package com.linson.android.hiandroid2.DesignPattern; import com.linson.LSLibrary.AndroidHelper.LSComponentsHelper; //一直以为不举模式,是模板模式。因为最初不举模式和模板模式都没看懂。干脆就没去看。 //道可道,非常道,名可名,非常名。一个名字称呼而已。实在区分不了。先把握开闭的基本原则就好。后面慢慢体会。 //做一个debug信息的输出模板 public class Bridge { public void run() { //2中变化。可以组合成为4种。 这个还不是重点。重点是变化的东西(接口),是在另一个变化当中(虚类). //如果有5个变化点。那么就有2×2×2×2×2种变化。不过有多少变化不是目的。而是说,如果有这种需求。那么不举模式bridge适合你。 //来一个最普通的,头部简单的的debug信息. //注意:normal就说明了它普通。而又传入了SimpleHeader Pringlog_normal pringlog_normal=new Pringlog_normal(new SimpleHeader()); String msg1=pringlog_normal.getLog("overtime"); //来一个最普通的,头部信息稍微详尽的的debug信息. //注意:normal就说明了它普通。而又传入了SimpleHeader Pringlog_normal pringlog_normal1=new Pringlog_normal(new DetailHeader()); String msg2=pringlog_normal1.getLog("overtime"); //来一个警告版本,头部信息稍微详尽的的debug信息. //注意:normal就说明了它普通。而又传入了SimpleHeader Pringlog_error pringlog_error=new Pringlog_error(new DetailHeader()); String msg3=pringlog_error.getLog("overtime"); LSComponentsHelper.LS_Log.Log_INFO(msg1+"\r\n"+msg2+"\r\n"+msg3); } public interface IDebugMsgHead { public String PrintHead(); } public class SimpleHeader implements IDebugMsgHead { @Override public String PrintHead() { return "1982:"; } } public class DetailHeader implements IDebugMsgHead { @Override public String PrintHead() { return "1982 01 01;line: 25"; } } public abstract class PringLog { public IDebugMsgHead mDebugMsgHead; public String getLog(String msgbody) { return mDebugMsgHead.PrintHead()+msgbody; } } public class Pringlog_normal extends PringLog { public Pringlog_normal(IDebugMsgHead msgHead) { mDebugMsgHead=msgHead; } @Override public String getLog(String msgbody) { return mDebugMsgHead.PrintHead()+". it it a msg body:"+msgbody; } } public class Pringlog_error extends PringLog { public Pringlog_error(IDebugMsgHead msgHead) { mDebugMsgHead=msgHead; } @Override public String getLog(String msgbody) { return "!!!!!!!!!!"+mDebugMsgHead.PrintHead()+msgbody; } } }