Guava源码解密:用设计模式打造高复用通用库!
Guava源码解密:用设计模式打造高复用通用库!
一、引言:通用工具库的设计之美
Google Guava 作为 Java 生态最有代表性的基础工具库,不仅以“好用”著称,更是设计模式工程化落地的典范。在移动端开发中,无论是Swift还是Kotlin,构建自己的高可复用通用库、底层能力沉淀、优雅的组件化体系,都离不开设计模式的加持。
二、Builder模式:简化复杂对象的创建
2.1 Builder模式原理
Builder模式用于构建复杂对象时,将对象的创建与表示解耦,使得同样的构建过程可以创建不同的对象表现(比如不同参数的配置)。
核心价值:
- o 让对象构建灵活可控,便于代码扩展和维护。
- o 支持“链式调用”风格,提升代码可读性。
2.2 Guava中的Builder应用
Guava广泛应用Builder模式,比如在集合类的构建、缓存模块的配置等,典型如ImmutableList.builder()、CacheBuilder等。
ImmutableList<String> list = ImmutableList.<String>builder()
.add("A")
.add("B")
.add("C")
.build();
2.3 移动端开发实践类比
Swift中的Builder风格链式创建(示例:自定义弹窗)
class AlertBuilder {
private var title: String?
private var message: String?
private var actions: [UIAlertAction] = []
func setTitle(_ title: String) -> AlertBuilder {
self.title = title
return self
}
func setMessage(_ message: String) -> AlertBuilder {
self.message = message
return self
}
func addAction(_ action: UIAlertAction) -> AlertBuilder {
self.actions.append(action)
return self
}
func build() -> UIAlertController {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
actions.forEach { alert.addAction($0) }
return alert
}
}
// 使用
let alert = AlertBuilder()
.setTitle("提示")
.setMessage("操作成功")
.addAction(UIAlertAction(title: "确定", style: .default))
.build()
Kotlin中的Builder风格链式配置(示例:网络请求参数)
class RequestBuilder {
private var url: String = ""
private val params = mutableMapOf<String, String>()
fun url(url: String) = apply { this.url = url }
fun param(key: String, value: String) = apply { params[key] = value }
fun build(): Request = Request(url, params)
}
data class Request(val url: String, val params: Map<String, String>)
// 使用
val request = RequestBuilder()
.url("https://api.xxx.com")
.param("token", "abc")
.param("id", "100")
.build()
2.4 工程启发
- o 可读性和扩展性极佳,适合对象属性较多、配置复杂的场景。
- o 在团队基础组件、业务SDK、UI工具等模块化建设中值得优先采用。
三、Wrapper模式(装饰器/包装器):灵活增强功能
3.1 Wrapper(装饰器)模式原理
装饰器(Decorator/Wrapper)模式的本质:在不修改原有类的前提下,为其动态地添加新功能。
核心价值:
- o 遵循开闭原则,增强已有能力而不侵入原有代码。
- o 支持功能的“可叠加”“可插拔”扩展。
- o 灵活应对产品、业务需求的变化。
3.2 Guava中的Wrapper模式应用
Guava大量使用装饰器模式,比如:
- o 集合视图(如Collections.unmodifiableList)、缓存包装(ForwardingCache)、流包装(ForwardingInputStream)
- o 事件监听链路包装
- o “链式”功能增强等
Guava通过前缀如ForwardingXXX类,将装饰能力抽象为Wrapper家族,极大提升了组件的灵活性和组合度。
public class ForwardingList<E> extends AbstractList<E> {
private final List<E> delegate;
public ForwardingList(List<E> delegate) { this.delegate = delegate; }
public E get(int i) { return delegate.get(i); }
public int size() { return delegate.size(); }
}
3.3 移动端开发实践类比
Swift:为图片加载器动态增加缓存/日志/监控功能
protocol ImageLoader {
func load(url: URL, completion: @escaping (UIImage?) -> Void)
}
class BaseImageLoader: ImageLoader {
func load(url: URL, completion: @escaping (UIImage?) -> Void) {
// 网络请求图片
}
}
// 装饰器:加缓存
class CachedImageLoader: ImageLoader {
private let base: ImageLoader
private var cache = [URL: UIImage]()
init(base: ImageLoader) { self.base = base }
func load(url: URL, completion: @escaping (UIImage?) -> Void) {
if let img = cache[url] { completion(img); return }
base.load(url: url) { [weak self] img in
if let img = img { self?.cache[url] = img }
completion(img)
}
}
}
Kotlin:为网络请求动态添加重试能力
interface RequestExecutor {
fun execute(request: String): String
}
class SimpleExecutor : RequestExecutor {
override fun execute(request: String) = "Result for $request"
}
class RetryExecutor(private val wrapped: RequestExecutor) : RequestExecutor {
override fun execute(request: String): String {
repeat(3) {
try { return wrapped.execute(request) }
catch (_: Exception) { /* retry */ }
}
throw Exception("Failed after retry")
}
}
3.4 工程启发
- o Wrapper模式让你的组件“像积木一样灵活组装”。
- o App常见场景如日志采集、埋点、权限校验、弹窗拦截、数据缓存等,都非常适合用装饰器方案。
四、策略模式(Strategy):灵活应对变化
4.1 策略模式原理
定义一组算法,把它们封装成独立的类,使它们可以相互替换,客户端可自由选择。
核心价值:
- o 消除if-else/switch分支判断
- o 新增/切换策略无需修改原有业务代码
- o 让代码更易扩展、单元测试和维护
4.2 Guava中的策略模式应用
如Guava的排序(Comparator)、事件分发、缓存淘汰策略等,均采用了策略接口+实现+可组合的思想。
Comparator<String> cmp = Ordering.natural().nullsLast();
ImmutableList<String> sorted = Ordering.from(cmp).sortedCopy(list);
4.3 移动端开发实践类比
Swift:灵活选择不同的缓存淘汰算法
protocol CacheEvictionPolicy {
func evict<T>(from cache: inout [String: T])
}
class LRUPolicy: CacheEvictionPolicy {
func evict<T>(from cache: inout [String: T]) {
// LRU算法实现
}
}
class FIFOPolicy: CacheEvictionPolicy {
func evict<T>(from cache: inout [String: T]) {
// FIFO算法实现
}
}
// 使用
var cache: [String: Int] = ["a":1, "b":2]
let policy: CacheEvictionPolicy = LRUPolicy()
policy.evict(from: &cache)
Kotlin:灵活选择不同图片解码策略
interface DecodeStrategy {
fun decode(data: ByteArray): Image
}
class PNGStrategy : DecodeStrategy {
override fun decode(data: ByteArray) = decodePNG(data)
}
class JPEGStrategy : DecodeStrategy {
override fun decode(data: ByteArray) = decodeJPEG(data)
}
fun processImage(data: ByteArray, strategy: DecodeStrategy) = strategy.decode(data)
4.4 工程启发
- o 遇到“同一功能多种实现/多种业务规则”,优先考虑策略模式
- o 典型应用:多种支付渠道、登录方式、埋点采集方式、缓存淘汰、排序、UI主题切换等
五、模板方法模式(Template Method):标准化流程,灵活定制
5.1 模板方法原理
父类定义流程骨架,子类实现具体步骤。实现“流程标准化+局部自定义”。
5.2 Guava的应用
Guava在集合构建、校验、转换等流程中,常用“部分默认实现+子类重写”机制。
abstract class FileProcessor {
void process() {
read();
validate();
write();
}
abstract void read();
abstract void validate();
abstract void write();
}
5.3 移动端实战类比
Swift:标准化页面生命周期流程
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
fetchData()
bindEvents()
}
func setupUI() { }
func fetchData() { }
func bindEvents() { }
}
Kotlin:标准化异步任务流程
abstract class AsyncTask<T> {
fun execute() {
onPreExecute()
doInBackground()
onPostExecute()
}
abstract fun onPreExecute()
abstract fun doInBackground(): T
abstract fun onPostExecute()
}
六、工程总结与实践建议
6.1 工程建议
- o Guava的设计模式应用,重在提升代码复用性、可维护性和灵活性。
- o 移动端同样适用:抽象能力+封装能力+组合能力,是高质量App的“基础设施”。
- o 沉淀基础能力,减少重复劳动,让团队有更多精力聚焦业务创新。
6.2 场景思考
- o 团队/个人在开发过程中遇到代码重复/功能堆积/流程难复用,要主动思考哪些可以沉淀为Builder、Strategy、Decorator等模式。
- o 多借鉴Guava等优秀库,提升工程设计的眼界与实践水平。