前言(一些废话,可以忽略)
- 今天来写另外一个中结构型模式,桥接模式,听上去好像要把一个东西和另外一个东西相互连接,其实我感觉这个模式的特点,也是灵活运用设计原则而已,即组合
- 将两个变化的部分分开,通过组合的方式拼凑在一起,运用很广泛,但是不一定会用桥接这种名词来命名
- PS.部分类实现见文末
解决一个问题
- 我们都知道,一个产品,有不同的维度,而不同的维度,往往可以组合在一起,拿手机来说
- 现在小米的全面屏手机、华为的全面屏手机,还有小米的刘海屏、华为的刘海屏,这就是4个类了
- 如果我们要增加一个曲面屏手机,那岂不是需要再增加两个类(小米曲、华为曲),才能满足要求
- 如果品牌很多,屏幕类型也很多的话,当发生变化的时候,就会需要增加很多类,所以我们采用桥接模式
- 将两个不同的维度、或者多个维度进行抽象,然后通过聚合的方式,让它们在一起工作
桥接模式
/**
* 品牌
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-28 28:16
**/
public abstract class Brand {
protected ScreenStyle style;
public Brand(ScreenStyle style) {
this.style = style;
}
public abstract void call();
}
- 屏幕样式,通过接口便于不同屏幕实现
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-28 28:16
**/
public interface ScreenStyle {
void display();
}
/**
* 手机
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-28 28:16
**/
public class HuaWei extends Brand {
public HuaWei(ScreenStyle style) {
super(style);
}
@Override
public void call() {
super.style.display();
System.out.println("HuaWei.call");
}
}
/**
* 屏幕
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-28 28:16
**/
public class CurvedScreen implements ScreenStyle {
@Override
public void display() {
System.out.println("CurvedScreen.display");
}
}
- 具体的使用,在扩展后,只需要修改调用的位置,需要声明屏幕,就使用什么屏幕,需要什么手机就使用什么手机
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2019-12-28 28:16
**/
public class BridgeMode {
public static void main(String[] args) {
ScreenStyle screenStyle = new FullScreen();
Brand phone = new HuaWei(screenStyle);
phone.call();
}
}
总结
- 个人感觉这个设计模式就是比较典型的通过设计原则来进行结构规划设计的一种了,而且很清晰简单,就通过组合或聚合模式,就将扩展性提升了几个层次。
愿你不舍爱与自由。