现在我们说一下桥接模式,打个比方,桥接模式就好比是小时候玩的搭积木一样,每一块积木都有自己的造型,但将它们组合起来可以实现不同的样式。我们还是拿《西游记》中的主角来解释这个模式,悟空是用金箍棒,八戒是用九齿钉耙,沙僧是用降妖宝杖的,每个使的兵器都是不同的,我们先来看一下例图吧:
好了,我们首先定义一个武器接口:
public interface Weapon{
public String getWeapon();
}
接着再定义了一个人的接口,这里面就有使用武器的方法,这里需要说清楚的是:人使用武器,而不是武器使用人,所以我们把接口类放在Person里面:
public interface Person {
public void setWeapon(Weapon weapon);
}
接口定义好以后就是每个接口的具体实现方法了:
我们先来定义三种武器:
金箍棒
public class JinGuBang implements Weapon {
private String weapon;
public JinGuBang() {
this.weapon = "金箍棒";
}
@Override
public String getWeapon() {
return weapon;
}
}
九齿钉耙
public class JiuChiDingPa implements Weapon {
private String weapon;
public JiuChiDingPa() {
this.weapon = "九齿钉耙";
}
@Override
public String getWeapon() {
return weapon;
}
}
最后就是降妖宝仗
public class XiangYaoBaoZhang implements Weapon {
private String weapon;
public XiangYaoBaoZhang() {
this.weapon = "降妖宝仗";
}
@Override
public String getWeapon() {
return weapon;
}
}
三种武器定义好以后就是三个徒弟类的实现了:
public class Wukong implements Person {
private String name;
private Weapon weapon;
public Wukong() {
this.name = "悟空";
}
@Override
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
@Override
public String toString() {
return name + "使用" + weapon.getWeapon();
}
}
这里定义了悟空需要武器来打妖怪,但是哪种武器没有具体说明,八戒和沙僧也是一样的,这里就不一一列出了,最后我们看一下Android中的实现:
public class XiyoujiActivity extends Activity {
private ListView listView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) findViewById(R.id.listView1);
//三个徒弟类
Person wukong = new Wukong();
Person bajie = new Bajie();
Person shasheng = new Shaseng();
//三种武器类
Weapon jinGuBang = new JinGuBang();
Weapon jiuChiDingPa = new JiuChiDingPa();
Weapon XiangYaoBaoZhang = new XiangYaoBaoZhang();
//设置孙悟空的武器为"金箍棒"
wukong.setWeapon(jinGuBang);
//设置八戒的武器为"九齿钉耙"
bajie.setWeapon(jiuChiDingPa);
//设置沙僧的武器为"降妖宝杖"
shasheng.setWeapon(XiangYaoBaoZhang);
ArrayList<Person> persons = new ArrayList<Person>();
persons.add(wukong);
persons.add(bajie);
persons.add(shasheng);
ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this,
android.R.layout.simple_list_item_1, persons);
listView.setAdapter(adapter);
}
}
里面的注释写得比较清楚了,大家应该能看明白,当然,你也可以给悟空其他武器用,OK,完成后的显示效果如下:
同以前一样,我们这里也进行一下重构,因为具体类里的变量跟方法都一样,我们将Person方法改成抽像类,让悟空,八戒,沙僧都继承它,这样,我们每个具体类里只要设置名字就可以了,其他的就不需要我们再写了,看一下改好的代码:Person类
public abstract class Person {
private String name;
private Weapon weapon;
public void setName(String name){
this.name = name;
}
public void setWeapon(Weapon weapon){
this.weapon = weapon;
}
@Override
public String toString() {
return name + "使用" + weapon.getWeapon();
}
}
里面就具体实现一些具体类要实现的方法,然后就是悟空,八戒和沙僧的类了,你看了一定吓一跳了,它们分别只有一行代码了:
public class Wukong extends Person {
public Wukong() {
this.setName("悟空");
}
}
就是每个人设置一下名字就行了,其他的都是依赖继承去实现了,另两个跟悟空一样,也是设置一个名字就行了。最终的Activity就是上面的Activity,Activity里面不需要修改任何代码,最终实现也跟上面的图一样,这里,我们就介绍了桥接模式,并对我们的代码进行了重构。再次谢谢大家的关注。