或许,已经使用过桥接模式的设计思想,只是,你可能不知道它叫“桥接模式”而已。
我们学习设计模式,并不一定要生搬硬套到我们的代码架构中,而设计模式背后的思想,才是真正的精髓。正如本文所讲的桥接模式,听起来很陌生,就算不陌生,也不像平时常用的单例、工厂、适配、代理模式频繁出现,但是,桥接模式的设计思想其实很简单,说不定你平时在写代码过程中,就已经悄悄用上了。
但是,桥接模式也难,它难在概念的理解上,如果是根据概念去思考分析某一个功能场景是否可设计为桥接模式,那么 ,理解起来就稍微费劲一点,但桥接模式的实现是很简单的,一起分析讨论下下面一个功能需求场景。
用手机主题来说,一套完整的主题,主要涵盖以下几个要素:
图标、字体、壁纸、息屏
我们平时在使用手机主题时,可以以一整套主题为单位来切换,也可以在已有的多套主题当中,混合选取不同的主题要素,比如应用主题A的字体,主题B的图标,主题C的壁纸和息屏,又或者是单独下载某一个元素,单独应用上这个元素和其他元素进行搭配。
从这个功能使用体验来看,它的设计是很灵活的,可任由用户随意搭配。那么,如果从代码实现的角度来看,该如何实现呢?
首先,设计大于实现,先看一下设计结构图:
这个架构图其实很简单,为了更好的扩展和更灵活的设计和搭配,我们把主题和主题的四大元素都做一个抽象,然后每一个主题、每一个主题元素都是由外部实现。
由于主题做了抽象,所以我们的手机主题商店里头,出现了各种各样的主题;又由于主题元素(字体、图标、壁纸、息屏)做了抽象,所以主题商店里又有各种各样的主题元素,用户也能根据自己的喜欢,进行混搭。
如果你是代码设计小白,还是云里雾里,我们直接看代码好了。
#抽象主题
public abstract class Theme {
// 主题ID
private Long themeId;
// 主题名字
private String themeName;
private Font font;
private Icon icon;
private Wallpaper wallpaper;
private AOD aod;
public Theme(Long themeId, String themeName,
Font font, Icon icon, Wallpaper wallpaper, AOD aod) {
this.themeId = themeId;
this.themeName = themeName;
this.font = font;
this.icon = icon;
this.wallpaper = wallpaper;
this.aod = aod;
}
public void show() {
System.out.println("主题名:" + themeName);
System.out.println("字体名:" + font.getEleName());
System.out.println("图标