弟弟抱怨:今天的业务有好多类啊!好烦啊!
我:业务不是有好多可以归类的吗?你可以使用桥接模式来减少代码量!
弟弟:说说看!
我:要说桥接模式,还需从《诛仙》和修真说起!
弟弟:这个好,这个好,玄幻修真是吾平生所爱。
我:你应该知道,修真的辅助职业有多条路可走
弟弟:炼丹,练器,练阵,御兽…
我:没错,修真界还有门派之分,比如《诛仙》
弟弟:我知道,青云门,天音寺,焚香谷…
我:那这些和桥接模式有什么关系呢?先来看张图
从图中我们可以看出,丹药分为青云门丹药,天音寺丹药,焚香谷丹药;
阵法分为青云门阵法,天音寺阵法。。。。
这样如果要新增加一类商品,每个门派都要增加,或者有个新的门派,就要新增加三种商品。扩展不方便,复用性差。
这时可以使用桥接模式,将维度分开。定义门派类别和商品类别,通过组合的方法,将两者联系在一起,形成桥接。看图!看图!
具体方法分三步:
- 将许多二维的概念拆分成一维;
- 其中一个维度实现同一个接口
- 类外一个维度继承同一父类,父类组合接口。
从图中看这九种商品存在着关系,也就是种类和门派互相组合而成。
看代码:
/**
* 商品类型维度
*
* @author czy
* @date 2021/6/22
*/
public interface Goods {
void buy();
}
/**
* 丹药
*/
class Elixir implements Goods{
@Override
public void buy() {
System.out.print("丹药");
}
}
/**
* 阵法
*/
class ZhenFa implements Goods{
@Override
public void buy() {
System.out.print("炼药");
}
}
/**
* 练器
*/
class LianQi implements Goods{
@Override
public void buy() {
System.out.print("练器");
}
}
/******************************************************************************/
/**
* 宗门维度
*
* @author czy
* @date 2021/6/22
*/
public abstract class Sect {
protected Goods goods;
public Sect() {
}
public void setGoods(Goods goods) {
this.goods = goods;
}
/**
* 获取宗门信息
*/
abstract void brand();
}
/**
* 青云门
*/
class QYM extends Sect{
public QYM() {
}
@Override
void brand() {
System.out.print("青云门的");
super.goods.buy();
}
}
/**
* 天音寺
*/
class TYS extends Sect{
public TYS(){}
@Override
void brand() {
System.out.print("天音寺的");
super.goods.buy();
}
}
/**
* 焚香谷
*/
class FXG extends Sect{
public FXG() {
}
@Override
void brand() {
System.out.print("焚香谷的");
super.goods.buy();
}
}
/*************************************************************************************/
/**
* 顾客测试
*
* @author czy
* @date 2021/6/22
*/
public class Client {
public static void main(String[] args) {
//我需要丹药
Elixir elixir = new Elixir();
//听说青云门的好
QYM qym = new QYM();
qym.setGoods(elixir);
System.out.print("我要买");
qym.brand();
}
}
弟弟:这个方法不错哦!我先试为强。
我:且慢,桥接模式优点是有的,但是也有缺点。听我说完你再试。桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者这对抽象进行设计与编程。* 桥接模式要求正确识别出系统中两个独立变化的维度,因此其适用范围具有一定的局限性。局限在维度上。你感觉合适才能用!
弟弟:中中中!我着了。