设计模式系列:桥接模式

概念

类的继承是类本身的垂直维度变化。如果需要水平维度上的变化扩展。继承是不好实现的。这时候我们可以引入桥接方式。桥接模式的做法是把变化部分抽象
出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。

实现

图片

Fruit:

1
2
3
4
5
6
7
8
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public interface Fruit {
public void eat();
}

AbstractFruit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public class AbstractFruit implements Fruit {

EatHandler eatHandler;

public AbstractFruit(EatHandler eatHandler) {
this.eatHandler = eatHandler;
}

@Override
public void eat() {
eatHandler.handle();
System.out.println("开始吃水果。");
}
}

Apple:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public class Apple extends AbstractFruit {

public Apple(EatHandler eatHandler) {
super(eatHandler);
}

public void enjoy() {
eat();
}
}

WaterMelon:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public class WaterMelon extends AbstractFruit {


public WaterMelon(EatHandler eatHandler) {
super(eatHandler);
}

public void eat() {
super.eat();
System.out.println("吃西瓜");
}
}

EatHandler:

1
2
3
4
5
6
7
8
9
10
11
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public abstract class EatHandler {

public void handle() {
System.out.println("吃水果前处理。");
}
}

PeelHandler :

1
2
3
4
5
6
7
8
9
10
11
12
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public class PeelHandler extends EatHandler {
@Override
public void handle() {
super.handle();
System.out.println("削皮");
}
}

EatHandlerDivid:

1
2
3
4
5
6
7
8
9
10
11
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public class EatHandlerDivid extends EatHandler {
public void handle() {
super.handle();
System.out.println("切块。");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.littlehui.design.bridge;

/**
* Created by littlehui on 2018/1/17.
*/
public class Client {
public static void main(String[] args) {
EatHandler eatHandler = new PeelHandler();
EatHandler eatHandler1 = new EatHandlerDivid();
Fruit apple = new Apple(eatHandler);
Fruit waterMelon = new WaterMelon(eatHandler1);
apple.eat();
waterMelon.eat();
}
}

如上代码解释:

  • 抽象部分 1:吃水果接口抽象,2.吃水果前处理抽象。
  • 具体实现部分 : apple里的enjoy

这里就分离了水果关于吃水果和水果处理的部分。Apple里的enjoy是具体的实现,可以eat,可以做其他操作。我们可以切换 水果处理 Handle来改变 Apple
enjoy具体时动作。

场景

总结

桥接的重点是 将实现解耦,抽象和实现独立开,不影响对方。
桥接一般用于跨多个平台的图形和窗口系统上。当需要不同的方式改变借口和实现时,可以用桥接。