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

 

小结:javascript

一、html

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

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

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

 

 

 

 

 

 

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

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

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

    具体作法:将小类规划,分类。而后实现代理Facade。api

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:\pyCGlang\cd1\新建文件夹 (2)\tmp>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();
  }
}
相关文章
相关标签/搜索