【chromium】常用设计模式:委托模式(Delegate Pattern)、观察者模式、 工厂模式。

文章目录

    • 对象行为型模式
        • 观察者模式(Observer Pattern)
    • 类创建型模式
        • 工厂模式(Factory Pattern)
    • Delegate 和 client
        • 委托模式(Delegate Pattern)
        • client 模式

对象行为型模式

观察者模式(Observer Pattern)

  • 像生产者消费者模型。

  • 通常使用在监听状态的情况下,通过AddObserver ,使得对方状态变化后,通知各个Observer 。

  • 例如:

    • NetExportFileWriter 类中,包含了内部类StateObserver,通过自身状态变化通知继承自StateObserverObserver,具体调用到OnNewState

类创建型模式

工厂模式(Factory Pattern)

https://www.cnblogs.com/yssjun/p/11102162.html

  • 简单工厂模式 (属于类创建型模式)

    • 通过给工厂类传入参数,工厂类负责根据不同参数创建实例。
    • 优点:实现对象的创建和使用分离 。(创建交给工行负责)
    • 缺点:不够灵活,新增类时需要修改工厂类。(违反开闭原则:开放扩展、封闭修改
    • 【chromium】常用设计模式:委托模式(Delegate Pattern)、观察者模式、 工厂模式。_第1张图片
  • 工厂模式

    • 定义一个用于创建对象的接口,让子类决定实例化哪个类,
    • 通过将产品类的实例化操作延迟到工厂子类中完成。新增产品类时需要新增个工厂继承自工厂类。(保证了开闭原则)
      【chromium】常用设计模式:委托模式(Delegate Pattern)、观察者模式、 工厂模式。_第2张图片
    • 保证了开闭原则,但是造成过多的工厂类。
  • 抽象工厂模式

    • 综合了简单工厂模式、工厂模式。(同样违反开闭原则)
    • 使得抽象工厂
      【chromium】常用设计模式:委托模式(Delegate Pattern)、观察者模式、 工厂模式。_第3张图片
  • 例如两个工厂子类:XiaoMiFactory、AppleFactory都继承自AbstractFactory 抽象工厂类,分别能实现makePhone、makePC

void main() {
     AbstractFactory* miFactory = new XiaoMiFactory();
     AbstractFactory* appleFactory = new AppleFactory();
     miFactory->makePhone();            // make xiaomi phone!
     miFactory->makePC();                // make xiaomi PC!
     appleFactory->makePhone();        // make iphone!
     appleFactory->makePC();            // make MAC!
 }

【chromium】常用设计模式:委托模式(Delegate Pattern)、观察者模式、 工厂模式。_第4张图片

Delegate 和 client

  • 两者有点像。
  • Delegate 是委托的意思,XXXDelegate 类必定对应一个 XXX 类,通常 XXX 通知 XXXDelegate 行为的发生,有时也询问特定行为的处理策略,可以理解为 XXXDelegate 是 XXX 行为的监听者(返回值为空)和决策者(返回值非空),与 Listener 和 Observer 的区别是 XXX 可以有 N 个Listener 或 Observer,但通常只能有一个 Delegate。

委托模式(Delegate Pattern)

  • 委托模式,某些类自己不执行一些任务,并把这些任务委托给另外一个类去执行,那么真正执行任务的类就被称为委托类。(可以保证不同web app 实现自己的定制需求)

  • chromium 每个模块具体功能的实现基本上都是通过Delegate类来实现的。

    • 如果开发者继承该Delegate类,并加以实现就能很方便的完成定制
    • 倘若开发者不需要某个模块的功能,也就不用实现相关的Delegate类,那么该模块就不会发挥效用。
  • 如: content\public\browser\download_manager.h 中的DownloadManager 实际工作 交给了 content\public\browser\download_manager_delegate.h中的 DownloadManagerDelegate 来实现。

    • Chrome, Content Shell, CEF3和Crosswalk都有自己的实现(chrome 的实现为 ChromeDownloadManagerDelegate,weblayer 的实现为DownloadManagerDelegateImpl
    • 开发者需要自己设计一个新的Delegate类来继承DownloadManagerDelegate,并覆盖相应的方法即可完成下载功能,另外需要通过SetDelegate方法,在程序开始时把自定义类的对象注册到DownloadManager中。
  • 即A_delegate 定义了委托模式的接口,具体A_delegate 的实现类A_delegate_impl 实现具体功能。

  • 同时存在 A_delegate_impl1、A_delegate_impl2、A_delegate_impl3。以实现不同的逻辑,那么使用A的时候通过set不同的delegate,以实现不同的逻辑,就像chromium支持的chrome、weblayershell、contentshell 等。

client 模式

  • Client 就是提供 Embedder API,让嵌入这实现 implement 注入自己的逻辑,以参与browser之类的逻辑。
  • "client "通常意味着一个接口,其实现由更高层次的嵌入者注入。例如,ContentClient是一个接口,由//content的嵌入者实现和注入的。
    • (如对于ContentBrowserClient,weblayer 通过ContentBrowserClientImpl、chrome 通过ChromeContentBrowserClient 注入了自己的 browser 逻辑 )

你可能感兴趣的:(chromium,chromium,设计模式,delegate,observer)