还是举例说明吧!现在有一个问题,那就是手机和手机应用。手机有很多牌子,应用也有很多,那某个手机上的应用,该怎么实现呢。
第一种架构:
这种架构非常简单,但有个明显的问题,那就是可扩展性差。比如再来一种手机或者应用,那类又得增加好几个。他虽然符合开放封闭原则,但却违背了职责单一性原则,即一个类应该只有一个引起它变化的原因。这个时候,桥接模式就派上用场了。
从UML类图里我们就能看出来,它使用了类的聚合而不是继承,设计模式里有一个原则,那就是合成/聚合复用原则。即尽量使用合成/聚合而不是继承。这是为了提高类的可复用性。
上代码:
package bridge;
public abstract class Phone {
protected App app;
public abstract void phone();
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
public void useApp() {
phone();app.app();
}
}
package bridge;
public class IPhone extends Phone {
@Override
public void phone() {
// TODO Auto-generated method stub
System.out.print("--IPhone--");
}
}
package bridge;
public class Android extends Phone {
@Override
public void phone() {
// TODO Auto-generated method stub
System.out.print("--Android--");
}
}
package bridge;
public interface App {
void app();
}
package bridge;
public class Game implements App {
@Override
public void app() {
// TODO Auto-generated method stub
System.out.println("play game");
}
}
package bridge;
public class MailList implements App {
@Override
public void app() {
// TODO Auto-generated method stub
System.out.println("open maillist");
}
}
package bridge;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Phone iPhone=new IPhone();
iPhone.setApp(new Game());
iPhone.useApp();
Phone android=new Android();
android.setApp(new MailList());
android.useApp();
}
}
桥接模式就是解决了这种多维度变化的类的组合问题。
jdbc就应用了桥接模式
不同的数据库管理系统可以任意切换,但对应用程序的实现影响不大。