足球战术->高中锋战术之singleton篇

博客介绍长传冲调高中锋战术,即单例模式。该战术特点是所有球长传冲调高中锋,攻势仅一个实例。其好处是简单实用、易扩展复用,且高中锋访问方法严格控制,避免污染命名空间。还给出了相关代码实现。

接上回:

http://www.youkuaiyun.com/develop/article/10/10935.shtm

长传冲调高中锋战术,也就是singleton,是最烂,
也是最快最直接的战术,它的特点是,所有球都
采用长传的方式直接冲调高中锋,所有的攻势都
只有一个实例,也就是高中锋。这个方法的好处
是简单实用,而且易于扩展复用:)复用后的
战术仍然只有一个实例,再急于扳平时可以使用。
还有就是高中锋的访问方法是严格控制的,同时
不采用让高中锋静态全局等待的方法,因为那样
会污染名字空间(也就是整体战术)。还有单个
高中锋是实实在在的(不是virtual),那样复用的
子战术不会变成多态的二高中锋或三高中锋,目标明确:P
代码如下:
class 高中锋{
public:
   static 高中锋* 实例();
protected:
   高中锋();
private:
   static 高中锋* _实例;
};

高中锋* 高中锋::_实例=0;

高中锋* 高中锋::实例(){
  if(_实例==0){
     _实例=new 高中锋;
    }
  return _实例;
}

<think>我们正在分析Chromium源码中的一段代码片段。这段代码位于Navigate函数中,主要处理导航过程中目标WebContents的确定。 代码片段如下: WebContents* contents_to_navigate_or_insert = params->contents_to_insert.get(); if (params->switch_to_singleton_tab) { DCHECK_EQ(params->disposition, WindowOpenDisposition::SINGLETON_TAB); contents_to_navigate_or_insert = params->switch_to_singleton_tab; } 我们需要解释这段代码的功能,并详细说明其上下文和逻辑。 背景: 在Chromium的导航系统中,NavigateParams结构体包含了导航所需的所有参数。其中,`contents_to_insert`是一个std::unique_ptr<WebContents>,表示如果导航需要插入一个新的WebContents(例如在新标签页中打开),则指向这个新WebContents的指针。而`switch_to_singleton_tab`是一个WebContents*指针,用于指向已经存在的单例标签页(singleton tab)。 代码解释: 1. 首先,将`contents_to_navigate_or_insert`初始化为`params->contents_to_insert.get()`。这意味着如果导航参数中指定了要插入一个新的WebContents(即`contents_to_insert`不为空),那么`contents_to_navigate_or_insert`将指向这个新的WebContents对象。 2. 然后,检查`params->switch_to_singleton_tab`是否为非空。这个标志表示是否应该切换到一个已经存在的单例标签页(singleton tab)。单例标签页是指在一个浏览器中只允许存在一个实例的标签页(例如设置页面chrome://settings)。 3. 如果`switch_to_singleton_tab`为真(即非空),则使用DCHECK宏来验证当前的导航类型(disposition)必须是`WindowOpenDisposition::SINGLETON_TAB`。这是因为只有单例标签页的导航才会使用这个参数。如果这个条件不满足,在调试模式下会触发一个断言错误。 4. 如果条件满足,那么将`contents_to_navigate_or_insert`重新赋值为`params->switch_to_singleton_tab`。这意味着我们将不再使用之前可能设置的`contents_to_insert`(即新创建的WebContents),而是使用已经存在的单例标签页(由`switch_to_singleton_tab`指向)。 作用: 这段代码的核心作用是确定导航操作的目标WebContents。它处理了两种情况: a) 正常情况下,导航可能需要创建一个新的WebContents(即`contents_to_insert`),那么目标就是这个新的WebContents。 b) 如果导航的目标是一个单例标签页,并且这个标签页已经存在(即`switch_to_singleton_tab`不为空),那么我们就直接使用已经存在的标签页(即复用),而不是创建新的。 这样做的目的是避免重复打开同一个单例页面(例如设置页面),而是激活已经存在的标签页。 上下文: 在之前的导航处理中,可能已经通过查找现有的标签页(例如通过`GetExistingSingletonTab`)来设置`params->switch_to_singleton_tab`。如果找到了已经存在的单例标签页,那么`switch_to_singleton_tab`就会被设置为指向那个标签页的WebContents指针。 总结: 这段代码是导航过程中选择目标WebContents的关键步骤,它确保了单例标签页的复用。 注意:`contents_to_navigate_or_insert`这个变量在后续的导航流程中会被使用,例如用于加载URL或者插入到标签条(TabStrip)中。 §§相关问题§§: 1. 在Chromium中,单例标签页(singleton tab)通常用于哪些页面? 2. `WindowOpenDisposition::SINGLETON_TAB` 与其他 disposition(如 NEW_FOREGROUND_TAB)有什么不同? 3. 在导航过程中,如何查找已经存在的单例标签页? 4. 如果单例标签页已经存在,导航会如何改变标签页的状态(例如激活、刷新等)?</think>### Chromium 导航系统中的 `contents_to_navigate_or_insert` 处理逻辑详解 在 Chromium 的导航系统(`chrome/browser/ui/browser_navigator.cc`)中,这段代码负责确定导航操作的目标 `WebContents` 对象。`WebContents` 是 Chromium 中表示网页内容的核心对象,相当于一个标签页的内容容器。 #### 代码解析: ```cpp WebContents* contents_to_navigate_or_insert = params->contents_to_insert.get(); if (params->switch_to_singleton_tab) { DCHECK_EQ(params->disposition, WindowOpenDisposition::SINGLETON_TAB); contents_to_navigate_or_insert = params->switch_to_singleton_tab; } ``` #### 关键逻辑解释: 1. **初始赋值**: ```cpp WebContents* contents_to_navigate_or_insert = params->contents_to_insert.get(); ``` - 从导航参数 `params` 中获取预创建的 `WebContents` 对象 - `contents_to_insert` 是 `std::unique_ptr<WebContents>` 类型,使用 `.get()` 获取原始指针 - 此对象表示**新创建**的标签页内容,用于在导航中插入新标签页 2. **单例标签页检查**: ```cpp if (params->switch_to_singleton_tab) { ``` - 检查是否需要切换到已存在的单例标签页(Singleton Tab) - `switch_to_singleton_tab` 是 `WebContents*` 类型,指向已存在的标签页 3. **一致性验证**: ```cpp DCHECK_EQ(params->disposition, WindowOpenDisposition::SINGLETON_TAB); ``` - 使用 `DCHECK` 验证导航类型必须是 `SINGLETON_TAB` - 确保逻辑一致性:只有单例标签导航才会设置 `switch_to_singleton_tab` 4. **目标切换**: ```cpp contents_to_navigate_or_insert = params->switch_to_singleton_tab; ``` - 将导航目标从新标签页切换到已存在的单例标签页 - 后续导航操作将作用于这个已存在的标签页而非新标签页 #### 单例标签页的典型场景: 1. **设置页面导航** 当用户尝试再次打开 `chrome://settings` 时: ```cpp // 伪代码 if (existing_tab = FindExistingSingletonTab("chrome://settings")) { params->switch_to_singleton_tab = existing_tab; params->disposition = WindowOpenDisposition::SINGLETON_TAB; } ``` - 系统会激活现有设置标签页而非创建新标签页 2. **Web App 主页导航** 在 PWA 应用中点击主页按钮时复用现有主页标签 3. **开发者工具** 保证只有一个开发者工具实例 #### 完整工作流程: 1. 导航开始时,`contents_to_insert` 可能指向新创建的空白标签页 2. 如果发现应使用现有单例标签页: - `switch_to_singleton_tab` 被设置为目标标签页指针 - 导航类型被标记为 `SINGLETON_TAB` 3. 此代码段执行目标切换 4. 后续流程使用 `contents_to_navigate_or_insert` 加载 URL #### 架构设计意义: 1. **资源优化**:避免重复创建相同内容的标签页 2. **状态保持**:保留用户在原标签页的交互状态 3. **用户体验**:激活现有标签页而非创建新标签页更符合直觉 4. **内存管理**:减少不必要的 `WebContents` 实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值