桥接模式:将抽象部分与他的实现部分分离,使它们都可以独立地变化。
这里的实现指的是抽象类和它的派生类用来实现自己的对象。
1.实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,
减少它们之间的藕合。
2.在桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用具体实现部分的对象,
而不能反过来,也就是个单向桥。
3.桥接模式使得抽象和实现可以独立变化,都可以分别扩充。也就是说抽象部分和实现部分是一种非常松散的关系。
4.桥接模式主要是把继承改成了使用对象组合,从而把两个纬度分开,让每一个纬度单独去变化,
最后通过对象组合的方式,把两个纬度组合起来,每一种组合的方式就相当于原来继承中的一种实现,
这样就有效的减少了实际实现的类的个数。
/**
* 实现部分的抽象类
*/
public abstract class Implementor {
public abstract void operation();
}
/**
*实现部分的具体实现类A
*/
public class ConcreteImplementorA extends Implementor{
@Override
public void operation() {
System.out.println("具体实现A的方法执行");
}
}
/**
*实现部分的具体实现类B
*/
public class ConcreteImplementorB extends Implementor{
@Override
public void operation() {
System.out.println("具体实现B的方法执行");
}
}
/**
* 抽象部分的类
*/
public class Abstration {
// 具体实现部分的对象
protected Implementor implementor;
public void setImplementor(Implementor implementor){
this.implementor = implementor;
}
public void operation(){
implementor.operation();
}
}
/**
* 抽象部分的具体实现类
*/
public class RefinedAbstration extends Abstration{
@Override
public void operation() {
implementor.operation();
}
}
public static void main(String[] args) {
// 抽象部分
Abstration ab = new RefinedAbstration();
// 具体实现类A
ab.setImplementor(new ConcreteImplementorA());
ab.operation();
// 具体实现类B
ab.setImplementor(new ConcreteImplementorB());
ab.operation();
}
桥接模式实例:(手机品牌软件)
/**
* 手机软件
*/
public abstract class HandsetSoft {
public abstract void run();
}
/**
* 手机游戏
*/
public class HandsetGame extends HandsetSoft{
@Override
public void run() {
System.out.println("运行手机游戏");
}
}
/**
* 手机通讯录
*/
public class HandsetAddressList extends HandsetSoft{
@Override
public void run() {
System.out.println("运行手机通讯录");
}
}
/**
* 手机品牌
*/
public abstract class HandsetBrand {
protected HandsetSoft soft;
// 设置手机软件
public void setHandsetSoft(HandsetSoft soft){
this.soft = soft;
}
// 运行
public abstract void run();
}
/**
* 手机品牌M
*/
public class HandsetBrandM extends HandsetBrand{
@Override
public void run() {
soft.run();
}
}
/**
* 手机品牌N
*/
public class HandsetBrandN extends HandsetBrand{
@Override
public void run() {
soft.run();
}
}
public class Main {
public static void main(String[] args) {
HandsetBrand ab ;
// 手机品牌N
ab = new HandsetBrandN();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
// 手机品牌M
ab = new HandsetBrandM();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
}
}
运行结果如下:
运行手机游戏
运行手机通讯录
运行手机游戏
运行手机通讯录