zoukankan      html  css  js  c++  java
  • 外观模式(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

  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9525782.html
Copyright © 2011-2022 走看看