# Proxy

# Histórico de Versão

Data Autor(es) Descrição Versão
26/10/2020 João Pedro Gomes(jppgomes) e Cauê(caue96) Adicionando utilização do proxy no projeto 0.1
16/11/2020 Lucas(lucasmidlhey) justificativa e link para artefatos 0.2

# Introdução

  O Pattern Proxy é um padrão Estrutural que faz parte do GoF (Gang of Four) e faz um papel intermediário entre o solicitante e o provedor. O solicitante é quem faz a requisição e o provedor entrega os recursos em resposta à requisição.

  O proxy é basicamente um encapsulador de um objeto que está realmente servindo.

  O padrão de proxy costuma ser utilizado quando se possui procedimentos complexos e é preciso fornecer uma interface simples. Também pode ser utilizado para fornecer uma camada de segurança aos objetos e uma interface local para objetos remotos em servidores diferentes.

  Outros papéis importantes do padrão são os seguintes:

  • Providenciar um substituto para um objeto controlar o acesso às classes;
  • Usar um nível extra de delegação para fornecer acesso controlado a um objeto;
  • Adicionar um agrupador e distribuidor para proteger um componente real de complexidade indevida.

# Estrutura

Estrutura Proxy

Segue um exemplo do uso de proxy no código do qrcode:

# Definição do proxy em qrcode.py

def auth_required(role=EmployeeRole.basic):
    """
    Verifies if request has a valid token.
    Then calls a permission strategy
    """

class Qrcode(ABC):

    @abstractmethod
    def generate(self):
        pass

class QrcodeTable(Qrcode):
    def __init__(self):
        self.table_id = None
        self.image_data = None

    def generate(self):
        image = qrcode.make("https://google.com.br")
        buffered = BytesIO()
        image.save(buffered, format="JPEG")
        self.image_data=base64.b64encode(buffered.getvalue()).decode("utf-8")
        self.table_id = randint(0, 1000)

class QrcodeProxy(Qrcode):
    def __init__(self):
        self.qrcode = QrcodeTable()

    def generate(self):
        qrcode = QrcodeProxy()
        if(self.qrcode is not None):
            qrcode.generate()

        qrcode.generate()

# Justificativa

O padrão Pattern Proxy é muito necessário em nosso sistema em por exemplo, lazy-loading tecnica utilizada para utilizar o banco apenas quando for necessário, otimizações em banco, permitindo criar rotinas de log e controle de acesso, e permitindo deixar claro o endereço do objeto real, afim de tornar mais pratico. Analisando nosso sistema acreditamos que utilizar o proxy foi uma medica paleativa e correta principalmente para reutilização do software.

# Referências

  • REFACTORING.GURU. Strategy. Disponível em: https://refactoring.guru/pt-br/design-patterns/proxy . Acesso em: 26 de outubro. 2020.
  • www.devmedia.com.br - Conheça o Pattern Proxy - GoF (Gang of Four). Disponível em: https://www.devmedia.com.br/conheca-o-pattern-proxy-gof-gang-of-four/4066. Acesso em 26/10/2020
  • pt.wikipedia.org - Proxy (padrões de projeto). Disponível em: https://pt.wikipedia.org/wiki/Proxy_(padr%C3%B5es_de_projeto). Acesso em 26/10/2020
  • github.com - Proxy. Disponível em: https://github.com/kelvins/design-patterns-python/tree/main/estruturais/proxy. Acesso em 26/10/2020