扩展知识

扩展

 

 

1.工厂模式

2.约束的第二种方法——定义抽象类

3.简历CMDB总结

 

 

 

工厂模式

  • 简单模式

    定义:工厂类会提供一个接口,并根据客户端传入参数来创建相应的实例对象。(创建一个对象)
    自己了解:只需要改变FlowerSimpleFactory类中的get_flower方法传入的类就可以得到想要的数据,***子类直接就是数据
    from abc import ABCMeta, abstractmethod
     
     
    class Flower(metaclass=ABCMeta):
     @abstractmethod
     def show_price(self):
      pass
     
     
    class Rose(Flower):
     def show_price(self):
      print('Rose price: $99')
     
     
    class Tulip(Flower):
     def show_price(self):
      print('Tulip price: $66')
     
     
    class FlowerSimpleFactory:
     def get_flower(self, flower_type):
      return flower_type()
     
     
    if __name__ == '__main__':
     flower_factory = FlowerSimpleFactory()
     rose = flower_factory.get_flower('Rose')
     tulip = flower_factory.get_flower('Tulip')
     rose.show_price()
     tulip.show_price()
     
  • 工厂方法模式

     定义:需要定义一个基类,不同的子类则代表着不同类型的对象。相对于简单工厂模式而言,工厂方法模式具有更强的可定制性。(创建一个对象)
     自己理解:我只需要改变FlowerShop1和FlowerShop2类中的方法中的代码就得到不同的结果,****子类决定自己
    from abc import ABCMeta, abstractmethod
     
     
    class Flower(metaclass=ABCMeta):
     @abstractmethod
     def show_price(self):
      pass
     
     
    class Rose(Flower):
     def show_price(self):
      print('Rose price: $99')
     
     
    class Tulip(Flower):
     def show_price(self):
      print('Tulip price: $66')
     
     
    class Lily(Flower):
     def show_price(self):
      print('Lily price: $33')
     
     
    class FlowerShopFactory(metaclass=ABCMeta):
     def __init__(self):
      self.flowers = []
      self.stock_flowers()
     
     @abstractmethod
     def stock_flowers(self):
      pass
     
     def get_flowers(self):
      return self.flowers
     
     def add_flower(self, flower):
      self.flowers.append(flower)
     
     
    class FlowerShop1(FlowerShopFactory):
     def stock_flowers(self):
      self.add_flower(Rose())
      self.add_flower(Tulip())
     
     
    class FlowerShop2(FlowerShopFactory):
     def stock_flowers(self):
      self.add_flower(Rose())
      self.add_flower(Tulip())
      self.add_flower(Lily())
     
     
    if __name__ == '__main__':
     flower_shop1 = FlowerShop1()
     for flower in flower_shop1.get_flowers():
      flower.show_price()
     
     flower_shop2 = FlowerShop2()
     for flower in flower_shop2.get_flowers():
      flower.show_price()
    
    
    Rose price: $99
    Tulip price: $66
    Rose price: $99
    Tulip price: $66
    Lily price: $33
     
  • 抽象工厂模式

     定义:需要定义一个抽象工厂类,然后由不同的子类来创建不同系列的对象,一个系列即代表一组对象。(创建一组对象)
     自己理解:随着抽象类定义的方法越多,子类可以继承的功能就可以越多,****父类成就子类
    from abc import ABCMeta, abstractmethod
     
     
    class MiniCar(metaclass=ABCMeta):
     @abstractmethod
     def show_size(self):
      pass
     
     
    class SedanCar(metaclass=ABCMeta):
     @abstractmethod
     def show_price(self):
      pass
     
     
    # 国产车
    class DomesticMiniCar(MiniCar):
     def show_size(self):
      print('Domestic mini car size: 111')
     
     
    class DomesticSedanCar(SedanCar):
     def show_price(self):
      print('Domestic sedan car price: 10W')
     
     
    # 英国车
    class EnglishMiniCar(MiniCar):
     def show_size(self):
      print('English mini car size: 222')
       
     
    class EnglishSedanCar(SedanCar):
     def show_price(self):
      print('English sedan car price: 30w')
     
     
    # 抽象工厂类
    class CarFactory(metaclass=ABCMeta):
     @abstractmethod
     def create_mini_car(self):
      pass
     
     @abstractmethod
     def create_sedan_car(self):
      pass
     
     
    # 国产车工厂类
    class DomesticCarFactory(CarFactory):
     def create_mini_car(self):
      return DomesticMiniCar()
      
     def create_sedan_car(self):
      return DomesticSedanCar()
     
     
    # 英国车
    class EnglishCarFactory(CarFactory):
     def create_mini_car(self):
      return EnglishMiniCar()
      
     def create_sedan_car(self):
      return EnglishSedanCar()

     

约束的第二种方法——定义抽象类

import abc

# 抽象类
class Base(metaclass=abc.ABCMeta):
    
    # 抽象方法
    @abc.abstractmethod
    def process(self):
        pass
class Foo(Base):
    pass
Foo()

 

简历CMDB总结

  • 项目名称

    CMDB / 资产管理系统 / 服务器配置管理系统 / 运维自动化平台
  • 项目描述

    CMDB是一套用于自动化采集服务器资产信息的项目,由于公司对于资产维护成本比较高并且数据准确性越来越低,因为原来都是搭建了samba服务,在内部共享了excel实现。通过cmdb项目可以改善资产采集的功能,减低人员成本提高工作效率,本项目实现主要有 采集中控机/restful api/资产管控平台 实现。5
     ​
     对于采集中控机可以支持多种模式进行操作,如:saltstack/ansible/paramiko默认,并且开发过程中遵循开放封闭原则并且利用 工厂模式 实现可扩展性的插件。
     ​
     对于api,是严格是遵循restful规范并使用 django rest framework框架实现,并在内通过反射机制实现资产变更记录以及资产的持久化处理。
     ​
     资产管控平台主要为运维及主管提供数据支持和部分报表,支持excel批量导入导出,支持利用时间轴清晰的展示服务器生命周期,基于highcharts实现数据报表的展示。
  • 技术点(项目功能/我的职责)

    • 针对不同公司的业务开发,使用 paramiko/ansible/saltstack 实现远程采集资产的扩展。

    • 参考 middleware 实现源码并结合工厂模式,开发出了可插拔式的采集资产插件。

    • 考虑到项目的严谨性,对于项目中的插件使用主动抛出异常进行约束。

      - 有没有其他的约束?
           通过abc实现抽象类和抽象方法实现约束。
       - 你为什么不用abc?而用异常?
           abc 操作起来比较麻烦,也可以实现。 
           我觉得抛出异常会更加简洁一些,并且我参考了一些源码,他们内部也是通过异常实现。 
       ​
       import abc
       ​
       # 抽象类
       class Base(metaclass=abc.ABCMeta):
           
           # 抽象方法
           @abc.abstractmethod
           def process(self):
               pass
       class Foo(Base):
           pass
       Foo()
    • 通过定制和扩展drf 内置authentication组件,实现用户认证。

    • 在restful api中实现api/版本/认证的功能。

    • 支持最服务器资产进行批量的导入导出,内部只用xlrd/xlwt模块进行操作。

    • 对于公司的服务器资产进行根据业务线做 数据报表的处理。

    • 基于rbac实现权限的信息的校验。

回到顶部

posted @ 2019-11-23 17:51  SupSnake  阅读(266)  评论(0编辑  收藏  举报