zoukankan      html  css  js  c++  java
  • 扩展知识

    扩展

    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实现权限的信息的校验。

    回到顶部

  • 相关阅读:
    PAT (Advanced Level) Practice 1129 Recommendation System (标记+排序)
    PAT (Advanced Level) Practice 1135 Is It A Red-Black Tree (30分) (红黑树知识+建树+判断)
    PAT (Advanced Level) Practice 1134 Vertex Cover (25分) (存边+标记点!!)
    PAT (Advanced Level) Practice 1133 Splitting A Linked List (25分) (静态链表的遍历)
    PAT (Advanced Level) Practice 1139 First Contact (30分) (unordered_map用来标记+哈希)
    PAT (Advanced Level) Practice 1132 Cut Integer (20分) (atoi、stoi区别、stringstream使用)
    PAT (Advanced Level) Practice 1138 Postorder Traversal (25分) (不键树、法一找规律法二先序中序变后序)
    区间DP学习 LibreOJ-10147 石子合并
    2020 Nowcoder Training
    UVA1347 Tour 动态规划
  • 原文地址:https://www.cnblogs.com/NiceSnake/p/11918988.html
Copyright © 2011-2022 走看看