• 外观模式(Facade) Adapter及Proxy 设计模式之间的关系 flume 云服务商多个sdk的操作 face


    小结:

    1、

    外观模式/门面模式 Facade  往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面。

    Proxy(代理)注重在为Client-Subject提供一个访问的中间层,如CORBA可为应用程序提供透明访问支持,使应用程序无需去考虑平台及网络造成的差异及其它诸多技术细节

    Adapter(适配器)注重对接口的转换与调整

    Web中的积累:外观模式 Facade - www.bysocket.com - 博客园 https://www.cnblogs.com/Alandre/p/4006831.html

    1  web三层构架,其实在数据访问层和业务逻辑层,业务逻辑层和表示层的层与层之间建立外观Facade模式应用,为复杂的子系统提供一个简单的接口或者抽象类,使得耦合大大降低。

    2  在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。

        具体做法:将小类规划,分类。然后实现代理Facade。

    3  在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须依赖于它。此时用外观模式Facade也是非常合适的。例如可以开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

    JAVA设计模式十九--Facade(外观模式) - Y-CAT的专栏 - CSDN博客 https://blog.csdn.net/hfmbook/article/details/7702642

    它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

    23种设计模式(1)-Facade设计模式 - 至尊宝 - CSDN博客 https://blog.csdn.net/duchao123duchao/article/details/51425085

    曾经我遇见的一个需求是这样的,接口A有个方法void methodA(),类B需要实现接口A的methodA()方法,并且在类B中需要把methodA()方法内部处理逻辑获得的结果利用C类实例的某个方法进行持久化操作。由于技术功力尚浅,开始我左思右想就是不能实现这个需求。开始纠结于两个难题:1,methodA()方法返回值为void,我无法获得methodA()内部逻辑获得的数据,无法获得这些数据,也就无法利用持久化类C进行处理;2,methodA()方法入参又为空,我的持久化类C也无法注入。当时我就懵逼了。还好,突然脑海想起了曾学spring时遇见的模板类设计模式,于是浅显学了下的模板类设计模式轻松把这个难题搞定。解决方法为,B定义为抽象类,内部再另外定义一个抽象方法absMethod(C c),其入参为持久类C类型,在B类的methodA()方法中调用这个抽象方法absMethod(C c),这样持久化类则注入到了methodA()方法中,则可以对其中的数据进行持久化操作了。然后只需要用D类继承这个B类,并且实现这个B的absMethod(C c)方法,这样就可以把C实例间接传入methodA()方法。

    设计模式 - 可复用面向对象软件的基础(高清版PDF) 

    1, 【GOF】的书中指出:在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统有一个门面类,整个系统可以有数个门面类。
    2,初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。

    需求:

    客户需要在管理后台给华为云、腾讯云、阿里云等不同的云服务厂商操控云资源

    已知云厂商提供创建api接口,但不同接口的方法不统一

    隔离变化,提供统一的接口

    (venv1) D:pyCGlangcd1新建文件夹 (2)	mp>tree /F
    文件夹 PATH 列表
    卷序列号为 0000-D760
    D:.
    │  biz.py
    │  __init__.py
    │
    ├─sdk0
    │  │  a.py
    │  │  __init__.py
    │  │
    │  └─__pycache__
    │          a.cpython-37.pyc
    │          __init__.cpython-37.pyc
    │
    ├─sdk1
    │  │  a.py
    │  │  __init__.py
    │  │
    │  └─__pycache__
    │          a.cpython-37.pyc
    │          __init__.cpython-37.pyc
    │
    └─unifiedSdk
        │  ECS.py
        │  __init__.py
        │
        └─__pycache__
                ECS.cpython-37.pyc
                __init__.cpython-37.pyc
    

      

    /tmp/sdk0/a.py

    def f():
        print('sdk0-f-通过华为云-创建服务器实例')
    

    /tmp/sdk1/a.py  

    def f():
        print('sdk1-f-通过腾讯云-创建服务器实例')
    

    /tmp/unifiedSdk/ECS.py

    def CreateInstance():
        import random
        a = random.randint(1, 10)
        if a > 7:
            from sdk0 import a
            f1 = a.f
        elif a < 3:
            from sdk1 import a
            f1 = a.f
        else:
            def f1():
                print('相关服务的sdk不存在')
        return f1

    /tmp/biz.py

    from unifiedSdk.ECS import CreateInstance
    
    for i in range(10):
        print(i)
        CreateInstance()()
    

      

    0
    sdk0-f-通过华为云-创建服务器实例
    1
    相关服务的sdk不存在
    2
    sdk0-f-通过华为云-创建服务器实例
    3
    相关服务的sdk不存在
    4
    sdk1-f-通过腾讯云-创建服务器实例
    5
    sdk1-f-通过腾讯云-创建服务器实例
    6
    相关服务的sdk不存在
    7
    相关服务的sdk不存在
    8
    相关服务的sdk不存在
    9
    sdk1-f-通过腾讯云-创建服务器实例
    

      

     Flume 1.9.0 Developer Guide — Apache Flume http://flume.apache.org/releases/content/1.9.0/FlumeDeveloperGuide.html

    import org.apache.flume.Event;
    import org.apache.flume.EventDeliveryException;
    import org.apache.flume.event.EventBuilder;
    import org.apache.flume.api.SecureRpcClientFactory;
    import org.apache.flume.api.RpcClientConfigurationConstants;
    import org.apache.flume.api.RpcClient;
    import java.nio.charset.Charset;
    import java.util.Properties;
    
    public class MyApp {
      public static void main(String[] args) {
        MySecureRpcClientFacade client = new MySecureRpcClientFacade();
        // Initialize client with the remote Flume agent's host, port
        Properties props = new Properties();
        props.setProperty(RpcClientConfigurationConstants.CONFIG_CLIENT_TYPE, "thrift");
        props.setProperty("hosts", "h1");
        props.setProperty("hosts.h1", "client.example.org"+":"+ String.valueOf(41414));
    
        // Initialize client with the kerberos authentication related properties
        props.setProperty("kerberos", "true");
        props.setProperty("client-principal", "flumeclient/client.example.org@EXAMPLE.ORG");
        props.setProperty("client-keytab", "/tmp/flumeclient.keytab");
        props.setProperty("server-principal", "flume/server.example.org@EXAMPLE.ORG");
        client.init(props);
    
        // Send 10 events to the remote Flume agent. That agent should be
        // configured to listen with an AvroSource.
        String sampleData = "Hello Flume!";
        for (int i = 0; i < 10; i++) {
          client.sendDataToFlume(sampleData);
        }
    
        client.cleanUp();
      }
    }
    
    class MySecureRpcClientFacade {
      private RpcClient client;
      private Properties properties;
    
      public void init(Properties properties) {
        // Setup the RPC connection
        this.properties = properties;
        // Create the ThriftSecureRpcClient instance by using SecureRpcClientFactory
        this.client = SecureRpcClientFactory.getThriftInstance(properties);
      }
    
      public void sendDataToFlume(String data) {
        // Create a Flume Event object that encapsulates the sample data
        Event event = EventBuilder.withBody(data, Charset.forName("UTF-8"));
    
        // Send the event
        try {
          client.append(event);
        } catch (EventDeliveryException e) {
          // clean up and recreate the client
          client.close();
          client = null;
          client = SecureRpcClientFactory.getThriftInstance(properties);
        }
      }
    
      public void cleanUp() {
        // Close the RPC connection
        client.close();
      }
    }
    

      

    https://github.com/grpc/grpc/blob/master/src/python/grpcio/grpc/framework/interfaces/face/face.py

  • 相关阅读:
    [转]tensorflow提示:No module named ''tensorflow.python.eager"
    mac使用pip3安装tensorflow(不用conda)
    不限速、没广告的迅雷(旧版迅雷)
    python从国内镜像安装第三方库
    Jupyter 安装并配置工作路径[转]
    VS2013只显示会附加到进程,无法启动调试
    电脑磁盘空间占用高于文件夹大小
    Latex基础
    C#/.Net 部分缩写
    texstudio设置外部浏览器及右侧预览不能使用问题
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9525782.html
Copyright © 2020-2023  润新知