接口选择问题。主要是为了动态实例化 。 工厂模式,不就是 字符串 -> 子类实例化。 还是用抽象来封装 差异性,我们的代码 就可以一对多。
创建对象型、结构型模式、行为型模式
设计模式分类原理:看我们怎么用这个抽象类了。关键都是 搞出一个抽象类出来,来屏蔽多个具体类。分类就看我们怎么用这个抽象类。
| 分类型 | 模式 | 我们怎么用? | 原有方式 | 新增类和方式 | 特点 |
|---|---|---|---|---|---|
| 创建型 | 工厂模式 | 返回一个抽象对象 | 直接实例化产品类 | 增加两个抽象类 - 工厂类和产品类。来抽象各种产品。原本是直接实例化产品类的。现在多了一层抽象,经过工厂类再实例化。多了一层之后,就相当于hack了,就可以屏蔽差异。 | 抽象出 类类型(一个抽象类) |
| 行为型 | 策略模式 | 调用抽象方法 来执行任务 | 直接调用实例方法。 | 增加一个抽象接口类。来抽象不同的方法策略。 | 抽象出 类行为(一个抽象接口类) |
| 结构型 | 桥接模式 | 调用抽象方法 来绑定 类关系 | 直接绑定 宿主类和寄生类 的关系 | 增加两个抽象类 - 抽象宿主类和抽象寄生类。用于抽象各种宿主,抽象各种寄生类。可以屏蔽各种绑定关系。 | 抽象出 类关系。会有两个抽象类,抽象类之间的关系是引用和被引用。适配器模式会抽象出一个适配类, |
| 适配模式 | 类无法直接调用另一类的方法。需要派生一个适配类间接调用。 | 增加一个抽象适配类,使得类可以经过适配类来调用另一个类。增加一个包装类。 | |||
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
抽象、封装、接口与实现分离。通过抽象,来屏蔽差异性,降低复杂度。
事实上,12.x就是做适配的事情,因为驱动本身就是可以用的,我们要在此之上封装一层,对接eth-logic的结构方式。适配类就是 eth_phy_port_info 。
adapter是要屏蔽 管理口和带外口的差异。
都要以结构体为 中心 交互对象。不要看函数调用。
C语言中的第一个结构体指针,一般都是表征为this指针,但有时候不是,比如适配类这边,就是传一个 待适配的对象而已。
适配类 就要在
eth_adapter_ioctl_cmd_upd_counter 这层都不用初始化的。算是接口类的。根本就不用 类根本不用赋能给对象。
这个抽象是怎么抽象的呢
执行不同的代码么?
究竟是 对象的特有数据,还是类的特有数据
但是适配的时候,有些数据又要重写。真是个问题
依赖>关联>聚合>组合
参数还是实例化。匿名还是具名。
主要还是 结合对象的生存周期 和 存储位置 来看。
| 关联方式 | 关系的存在周期 | 关系信息的存储 | 被动对象的生命周期 | 可见性 | 状态 | 关系的表征:属性 | 关系的表征:方法调用 | 举例:存储位置 |
|---|---|---|---|---|---|---|---|---|
| 依赖 | 方法调用 | 方法函数帧 | 各自无关或方法调用周期内 | 局部匿名 | 无 | 方法的参数、局部对象、返回值 | ||
| 关联 | 建联后到对象消亡 | 对象属性 | 各自无关 | 全局可见 | 属性:引用 | NA | 链表 。 | |
| 聚合 | 建联后到对象消亡 | 对象属性 | 各自无关且持久 | 全局可见 | 属性:引用 | g/setter方法 | 在该对象内,改变另一对象的状态。 | |
| 组合 | 对象的生命周期 | 对象属性 | 绑定一起 | 仅互相可见 | 属性:成员对象或类 | g/setter方法 |
关联包含聚合和组合。
参考:
关系的存在周期 和 对象的生命周期 是不一致的。
关联只是留下一个指针而已,留下一个引用而已,指向另一个对象而已。 将两个对象关联起来,就是互相留下电话号码而已,这是个长久的联系方式。依赖,就是陌生人 就合作下,不电话 就走了。再也不见。依赖这个东西的存在,
什么是有机整体,什么是互相影响? 两个状态机之间的额状态互相影响。
和上层业务交互的一层。
和客户端交互的代码肯定要是抽象层的代码。业务交互框架层。
上层逻辑端口也是有一定的多样性的,我们也应该有所屏蔽的处理,所以要多一个抽象层。所以一般模块都要两层抽象层,中间一个适配层。这就是子模块的最小单位啦。
适配类是抽象类么
其实比较要桥接模式。桥接模式就是 再 加一层抽象吧
所以这个 不叫作适配吧。 如果 把 net_device算进来,那就算适配了,但是没有! 我们直接绕过netdevice的话,就不叫适配类了吧。 适配蕴含的意思是 要去兼容现有的东西。
做一些 hack的操作,控制通路的过滤、拦截和转发 就可以了,就当做一个中转站而已。
适配+改造。
控制路完全可以采用 net_device的接口。
数据路我们自己 要改造下。
装饰者模式更加灵活啊,相比组合集成的方式。
外观是对内部子类的方法 进行排列组合封装下。
应该快转这边 统一管理协议栈才对啊。 但是现在是通路从我们这边捞 数据奥。
eth_adap_rg_rx_enqueue 这个接口的位置不对,应该放在frame层。
行为模式:对象间的交互方式。UML主要的交互方式就是 关联。对象之间的关系。
行为模式,如何调用方法的。怎么交互。
结构模式: 代码怎么拆解模块。模块 要怎么拆解来解耦。模块怎么拆解子模块。 输入输出 怎么拆解,业务需求对应到模块内部怎么拆解,模块内部 怎么交互。结构拓扑。
行为模式:平等对象之间的联系。要怎么通信。N个对象的对通信有N*N种情况。每个对象都要保存其他对象的引用,太浪费了
结构模式:有部分类不变的情况下,对象怎么组合? 一开始就要准备好
建造模式:有需要时 按需生成对象。
| 关联形式 | 各个对象的生命周期 | 方式 | |
|---|---|---|---|
| 建造模式 | 关联 | 子类在主类中实例化,子类脱胎于母类。 | |
| 结构模式 | 聚合 | 有依赖。持有一个对象。 | 拥有被适配类所有功能 |
| 行为模式 | 关联 | 对象间的 生命周期无关 平等的生命,大家只是通信而已 | 只调用部分方法。 |