桥接者模式,其主要作用是分离抽象类和实例,使他们都可以独立的变化,举个简单的列子来说,动物有很多种,每一种动物有可能有不同的叫声,比如狗是一种动物,狗的叫声是汪汪汪,猫也是一种动物,猫的叫声是喵喵喵。但是也可能突然有一天,有一只狗学会了猫叫(比如二哈,完全有可能),那此时这只狗的叫声又是喵喵喵了,同理,猫也可能发生同样的变化,也就是说,动物和动物的叫声,可以是相互独立变化的,下面在程序中,我们使用桥接者模式,来实现以下这个场景。
首先我们定义好动物的抽象类:
abstract class Animal
{
protected barkAPI b;
abstract void bark();
}
动物都会叫,于是我们在抽象类中,固定bark函数。
接下来是定义一个叫的接口:
static interface barkAPI
{
void bark();
}
然后我们分别实现狗叫的接口和猫叫的接口:
class Miao implements barkAPI
{
@Override
public void bark() {
System.out.println("喵喵喵~");
}
}
class Wang implements barkAPI
{
@Override
public void bark() {
System.out.println("汪汪汪~");
}
}
这便是我们一开始所说的,桥接模式中,将“抽象”和“实现”分离开来的具体表现了,这便是“实现”了。
然后是具体的 狗和猫的类实现:
class Dog extends Animal
{
Dog(barkAPI bark)
{
super.b=bark;
}
@Override
void bark() {
if(b==null)
{
System.out.println("我不知道怎么叫。。");
}
else
{
b.bark();
}
}
}
class Cat extends Animal
{
Cat(barkAPI bar)
{
b=bar;
}
@Override
void bark() {
if(b==null)
{
System.out.println("我不知道怎么叫。。");
}
else{
b.bark();
}
}
}
这是将抽象部分和实现部分合起来,然后查看一下我们在实际应用过程的应用。
Miao m=new Miao();
Wang w=new Wang();
Cat cat=new Cat(m);
Dog dog=new Dog(w);
cat.bark();
dog.bark();
打印结果:
喵喵喵~
汪汪汪~
ps:在看完桥接者模式的时候,我其实当时立马就想到了Thread类,jdk中线程类的实现。还记得我们创建线程的三种方式嘛,其中有一种new Thread(new runnable(){void run(){})的写法。这难道不就是我们的桥接者模式嘛,将抽象的线程类和线程的具体执行内容分离开,用过runnable接口来桥接。不知道是不是的,我有看过Thread在jdk中的源码,确定他就是在thread类的run方法中执行rannable的run方法的,就是不知道这和我理解的桥接者模式是否是一样的,毕竟今天刚学桥接者,怕理解错了之类的。欢迎大神指点。