外觀模式(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();
  }
}
相關文章
相關標籤/搜索