Guava源码解密:用设计模式打造高复用通用库!

Guava源码解密:用设计模式打造高复用通用库!

编码文章call10242025-08-25 20:58:563A+A-

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等优秀库,提升工程设计的眼界与实践水平。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4