21

桥接模式

 3 years ago
source link: http://www.cnblogs.com/ljsh/p/12821938.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

桥接模式

先不说定义直接来看一个问题,有一个手机抽象类

public abstract class Phone{
    public abstract void getName();
    public abstract void getRam();
}

里面有两个抽象方法,获得手机型号和内存大小。现在我们想实例化小米10这个型号的手机

public class Mi106g extends Phone {
    @Override
    public void getName() {
        System.out.println("小米10");
    }

    @Override
    public void getRam() {
        System.out.println("6");
    }
}
public class Mi1068g extends Phone {
    @Override
    public void getName() {
        System.out.println("小米10");
    }

    @Override
    public void getRam() {
        System.out.println("8");
    }
}

两个方法可能看起来不明显,是1x2,如果现在多出一个方法是getRom,Rom的种类有3种,128,256,512。那么需要的类就变成了1x2x3,属性越多需要的类就越多,这样维护起来就很麻烦。这时候我们就需要用组合解决这个子类爆炸的问题

public abstract class Phone {
    Ram ram;
    public void setRam(Ram ram){
        this.ram = ram;
    }
    public abstract void model();
}

public abstract class Ram {
    public abstract void getRam();
}

现在Ram作为一个单独的类,和Phone组合

public class Mi10 extends Phone {
    @Override
    public void model() {
        System.out.println("Mi10");
    }
}
public class Ram6 extends  Ram {
    @Override
    public void getRam() {
        System.out.println("6g");
    }
}
public class Ram8 extends  Ram {
    @Override
    public void getRam() {
        System.out.println("8g");
    }
}

那我们要获得一个6g的Mi10怎么来弄呢

Phone Mi106g = new Mi10();
Mi106g.setRam(new Ram6());

或者是设置在构造函数里,重点在于组合。

现在来看一下桥接模式的定义

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

我感觉这个确实有点抽象不太好理解,这里不是说编程语言里的抽象和实现,结合上面的例子,手机的型号可以理解为抽象,Ram理解为实现,因为手机型号是一个笼统的概念,而Ram就是内存本身,通过把他俩分离开来,型号可以单独的变化,内存大小也可以单独的变化,然后再组合到一起。

总结

个人觉的桥接模式就是用组合避免继承子类爆炸问题


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK