bridge桥接模式的目的和decorator装饰器模式是一样的,都是避免过多的子类,只是它们的实现的方法有所不同,桥接模式采用聚合的方式来实现。要对类的功能进行扩展,可以修改现有的代码来做,但是如果一个父类的n个子类都要该功能,那么就得修改n次,不但工作量大而且重复代码量很多。这也违反了面向对象的开放/封闭原则(对扩展来说是开放的,对修改来说是封闭的)。在前面的《decorator装饰器模式》中提到的“父类的n个子类的都要派生出子类并实现这些功能”,这种方来处理但然也是不合理的。
bridge桥接模式中“将抽象化与实现化脱偶,使得二者可以独立地变化”的意思,就是利用聚合的方法对,在新类中对原接口进行封装,并实现特定的功能,用户只要向该新类传进原接口的一个子类的引用,对原接口对象进行实例化,用户就可以得到某些的应用。如果需要就对添加的类进行任何的改变,只要修改该新添加的类就行了。这就是独立地变化的体现。
在decorator装饰器模式中,如果原父类的方法较多,那么Decorator继承过来的函数也就会很多。使用桥接模式就不存在这种情况。也就是说如果只想对目的类的某个或几个方法,用桥接模式就行了,代码量比较少。如果想像原类的一样使用新类,就用装饰器模式,但是可能会带来不必要的麻烦。
public interface Info{
public String read();
public void save();
public void setStr(String str);
public String getStr();
}
public class FileInfo implements Info{
protect String str;
public void read(){/*...*/}
public void save(){/*...*/}
public void setStr(String str){this.str=str;}
public String getStr(){return str;}
}
public class NetInfo implements Info{
protect String str;
public void read(){/*...*/}
public void save(){/*...*/}
public void setStr(String str){this.str=str;}
public String getStr(){return str;}
}
public interface Bridge{
public void save();
}
public class XmlDocument implements Bridge{
private Info info;
public XmlDocument(Info info){this.info = info;}
public void save(){xml();info.save();}
public void xml(){String str=info.read();/*对str进行处理...*/info.setStr(str);}
}
public class EncrypDocument implements Bridge{
private Info info;
public EncrypDocument(Info info){this.info = info;}
public void save(){encryp();info.save();}
public void encryp(){String str=info.read();/*对str进行处理...*/info.setStr(str);}
}
public class Main{
public static void main(String args[]){
Info info = new NetInfo();
Bridge b = new XmlDocument(info);
b.save();
}
}