设计模式-适配器模式
适配器模式目的就是不改变原有系统的基础上保留其提供的服务,向调用者提供新的接口服务,使得原本由于接口不兼容而不能一起工作的类可以一起工作。(简单说就是增加兼容性,复用已经存在的功能)
笔记本电脑的电源变压器就是这个原理,把交流电转换成直流电。或者把英文翻译成中文,都是适配器模式。
又分为2种:
- 对象适配器模式
- 类适配器模式
适配器虽好,但也不要乱用,如果能在设计阶段就统一就是最好的,适配器模式更像是一种补丁。
适配器模式目的就是不改变原有系统的基础上保留其提供的服务,向调用者提供新的接口服务,使得原本由于接口不兼容而不能一起工作的类可以一起工作。(简单说就是增加兼容性,复用已经存在的功能)
笔记本电脑的电源变压器就是这个原理,把交流电转换成直流电。或者把英文翻译成中文,都是适配器模式。
又分为2种:
适配器虽好,但也不要乱用,如果能在设计阶段就统一就是最好的,适配器模式更像是一种补丁。
最近看了下关于OpenStack如何统计更新CPU、内存、硬盘等硬件资源的部分,由于历史原因下面的代码来自newton
版。
简单说,OpenStack先通过定时任务进行资源统计,入口代码位于nova\compute\manager.py
中ComputeManager
类的update_available_resource
函数。默认情况下每分钟更新一次:
@periodic_task.periodic_task(spacing=CONF.update_resources_interval)
def update_available_resource(self, context):
"""See driver.get_available_resource()
Periodic process that keeps that the compute host's understanding of
resource availability and usage in sync with the underlying hypervisor.
:param context: security context
"""
compute_nodes_in_db = self._get_compute_nodes_in_db(context,
use_slave=True)
nodenames = set(self.driver.get_available_nodes())
for nodename in nodenames:
self.update_available_resource_for_node(context, nodename)
self._resource_tracker_dict = {
k: v for k, v in self._resource_tracker_dict.items()
if k in nodenames}
# Delete orphan compute node not reported by driver but still in db
for cn in compute_nodes_in_db:
if cn.hypervisor_hostname not in nodenames:
LOG.info(_LI("Deleting orphan compute node %s"), cn.id)
cn.destroy()
首先获取所有节点,然后维护了一个名为_resource_tracker_dict
的字典用来记录host和ResourceTracker
实例的对应关系,所有的资源更新行为都在ResourceTracker
中进行处理。
单例模式可以说是最容易理解的一种设计模式了,当需要某个类仅有一个全局唯一对象时可以使用,比如某些配置项。核心思想就是新建某个类实例时先进行一次判断,如果不存在则创建新实例返回,否则返回已经存在的实例。
原型模式(Prototype Pattern):使用原型实例创建指定创建对象的种类,并通过拷贝这些原型创建新对象。这个模式很好理解,就是ctrl+c,ctrl+v
后做一些小修改。
这里面涉及一个知识点就是深拷贝和浅拷贝的问题,但我相信任何python开发人员都知道copy()
和deepcopy()
的区别,这里就不多说了(有兴趣的可以去看python中这2个函数的实现)。
个人理解当需要多个类对象时,如果要进行很多复杂的、消耗时间的初始化操作,而这些对象之间又仅有少量不同时,可以考虑使用原型模式。
建造者模式(Builder Pattern):将复杂对象的创建和表示分离,使同样的构建过程可以创建不同的表示。
进一步说,建造者隐藏了产品是如何组装的,使建造代码和表示代码分离。建造对象时 构件顺序稳定 的情况下,不管每一步具体怎么变都可以适用。
工厂模式又可以分为工厂方法模式和抽象工厂模式。
工厂模式是指:定义一个接口用户创建对象,让子类决定实例化哪一个类。
工厂模式中存在4个角色:
抽象工厂产生抽象产品,具体工厂生产具体产品。 这句话很重要,理解了这句话就理解了工厂方法模式。