设计模式(7):桥接模式 Bridge

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

桥接模式 Bridge

问题:

“Hardening of the software arteries” has occurred by using subclassing of an abstract base class to provide alternative implementations. This locks in compile-time binding between interface and implementation. The abstraction and implementation cannot be independently extended or composed..

意图:

例:比如我想举办一个抽奖活动,奖品分为两类,一类是积分虚拟奖,一类是实体大奖,
两种奖在后台的验证规则一同,实体奖可能会针对用户的中奖记录,合法性,奖池等等进行多项验证,虚拟奖则比较松
对用户来说,只需要抽奖即可,服务端用个连接器,把这两种验证桥接在一起,来看看

代码1:如果是用户只想抽奖,则奖品则是抽象化的东西,先定义奖品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.xdnote.DesignPattern.structural.bridge;

public abstract class Prize {

private String name = "";

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public abstract boolean validate();

@Override
public String toString() {
return this.name.equals("")?"哎,什么都没中":"恭喜您中得";+this.name;
}

}

代码二:分别定义小奖品与大奖品,以代表服务器对两种不同的奖品有不同的处理方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class SmallPrize extends Prize{

@Override
public boolean validate() {
double d=Math.floor(Math.random()*100);

if(d<5){
this.setName("优惠券10元");
return true;
}else if(d>30){
this.setName("金币10个");
return true;
}else if(d>80){
this.setName("金币1个");
return true;
}
return false;
}

}
public class BigPrize extends Prize{

@Override
public boolean validate() {
//大奖来了,这里面验证奖品是否还有
double d=Math.floor(Math.random()*100);
if(d>5){
this.setName("5000000000元");
return true;
}else if(d<30){
this.setName("宝马车");
return true;
}else if(d<80){
this.setName("5块小钱");
return true;
}
return false;
}
}

代码三:桥接-摇奖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class PrizeBridge {
public static Prize getPrize(){
Prize prize = null;
//这个数本应该是客户端获取之后再传过来的,原始模式DEMO对由于场景对模式稍作改进,
//发挥下思考,真正的摇奖程序,还要载入用户信息,奖项配置等。
double d=Math.floor(Math.random()*100);
if(d<10){
prize = new BigPrize();
}else{
prize = new SmallPrize();
}
prize.validate();
return prize;
}

}

代码四:客户端调用

1
2
3
4
5
6
7
8
9
10
//对客户端来说,只需要抽奖即可,服务端用个连接器
public static void main(String[] args) {
System.out.println(PrizeBridge.getPrize());
System.out.println(PrizeBridge.getPrize());
System.out.println(PrizeBridge.getPrize());
System.out.println(PrizeBridge.getPrize());
System.out.println(PrizeBridge.getPrize());
System.out.println(PrizeBridge.getPrize());
System.out.println(PrizeBridge.getPrize());
}

小结

桥接模式 Bridge

这个也算不上模式了,实际上就是通过条件判断走到各自的流程,再返回同类型的对象