设计模式之桥接模式
Posted 郭梧悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之桥接模式相关的知识,希望对你有一定的参考价值。
说实话,在应用中很少使用这个模式,这个模式个人表示有点令人费解。但是我想着既然自己单独弄了个设计模式的专栏,那就要一个不拉的把它们都写完,给本专栏来一个完美的结局。
定义
将抽象和实现解耦,使得它们可以分别独立的变化。该模式是继承关系的替代方案
用处:
可以通过聚合代替继承来解决子类爆炸性增长的问题
应用例子:
小说《知北游》这部十几年前看过的第一部网络小说,不知道读者里面有没有读过这本小说的同道中人,当时真的是被里面的内容给惊艳到了,原来小说还可以这么写吗!现在的网络小说基本上都是套路文,没啥看头了。咳咳,闲言少叙,书归正传。还是回到桥接模式上面来。《知北游》书里面分为九重天,比如清虚天、色欲天、黄泉天、罗胜天等,每一重天又分为许许多多不同的帮派(姑且这么理解,读过知北游的道友不要较真,比如有的天就没有帮派),比如清虚天的碧落赋,罗生天的脉经海殿等等,要是把它们的关系用java或者其他面向对象的语言来抽象表示出来,有两种方案,其中之一就是使用常规的继承方案 ;第二种是使用桥接模式的方案。
继承方案
先来看看第一种继承方案,先设计个九重天接口,然后罗生天、黄泉天、色欲天等为九重天的派生子类。而每重天又派生出了大大小小个帮派,所以其设计结构图如下:
但是这么做有一个缺点,就是帮派和每重天耦合太严重。上图中博主有意的将九重天的颜色和帮派的颜色作为区分。上面设计一个错误的地方就是将帮派作为每重天的子类,每重天和帮派之间并不是父子关系,比如在罗升天的某个帮派可以迁移到魔刹天去。但是上图天与帮派这种直接的派生关系限制了帮派的迁移,二者不能独立的变化。使用桥接模式可以解决这个问题。
桥接模式方案
将九重天和帮派解耦,分别对帮派和九重天设计成两个接口。变成如下的样式:
注意在本篇博文中抽象化的角色是帮派,而实现类的角色是九重天。简单用代码表示如下,九重天的接口及其实现类:
//九重天接口
public interface JiuChongSky {
String inform();//提供九重天信息
}
//清虚天
public class QingXuSky implements JiuChongSky{
@Override
public String inform() {
return "秘道术的天下,甘柠真出自这里";
}
}
//罗胜天
public class LuoShengSky implements JiuChongSky{
@Override
public String inform() {
return "甲御术的天下,海姬出自这里。后其姐姐海妃被楚度与清虚天公子樱密谋所灭";
}
}
帮派的抽象类及其子类,帮派百度翻译成(Gang):
//帮派抽象类
public abstract class Gang {
JiuChongSky jcs;//包含一个九重天的引用
public Gang(JiuChongSky jcs){
this.jcs = jcs;
}
public void printSkyInfo(){
System.out.println(jcs.inform());
}
public abstract String name();
}
/**
*罗生天脉经海殿
*/
public class MaiJingHaiDian extends Gang{
public MaiJingHaiDian(JiuChongSky jcs) {
super(jcs);
}
public String name(){
return "脉经海殿";
}
}
/**
*清虚天首席帮派碧落赋
*/
public class BiLuoFu extends Gang{
public BiLuoFu(JiuChongSky jcs) {
super(jcs);
}
public String name(){
return "碧落赋";
}
}
总的来看桥接模式的思想就是让抽象部分持有实现部分的引用,可以通过该引用来操作具体的实现。但是怎么区分抽象部分和实现部分以及在代码里怎么实际应用,就不好说了:
以上是关于设计模式之桥接模式的主要内容,如果未能解决你的问题,请参考以下文章