Façade

Intenção

Fornecer uma interface unificada para um conjunto de interfaces em um subsistema.

Vantagens

Desvantagens

Exemplos

Exemplo #1

No projeto de um aparelho para IoT (Internet of Things), são adicionados sensores de diversos tipos como, por exemplo, sensor de temperatura, de umidade, de luminosidade, etc. Cada sensor tem uma interface diferente, oriunda do seu fabricante e da sua forma de funcionamento. Alguns sensores podem retornar strings, números ou valores que necessitam de tratamento especial para gerar um resultado útil ao cliente. Esse resultado será exibido em um painel como uma string (por ex.,"30ºC"). Em alguns casos, o resultado pode demandar que determinados sensores trabalhem em conjunto (por ex. vários sensores de umidade no mesmo aparelho) na obtenção de um único valor calculado (por ex. a média de umidade). A classe IotSystem funciona como uma fachada e reúne as classes TemperatureSensor, HumiditySensor e LuminositySensor que implementam a funcionalidade do sistema IoT, sem ocultá-las completamente.  

Diagrama de Classe

Exemplo #1 - Diagrama

Participantes

  • Façade (IoTSystem): delega solicitações de clientes a objetos apropriados ao subsistema.
  • Classes de subsistema (TemperatureSensor, HumiditySensor, LuminositySensor): implementam a funcionalidade do subsistema.

 

Código

package com.padroesdr.facade;

public interface SensorInformation {

    public String getStatus();
}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.facade;

/**
 *
 * @author Adriano Gonçalves
 */
public class LuminositySensor {

    public float readValue() {
        // Do something and return the result
        return (float) ((float) Math.random() * 100.);
    }

}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.facade;

/**
 *
 * @author Adriano Gonçalves
 */
public class HumiditySensor {

    public float readValue() {
        // Do something and return the result
        return (float) ((float) Math.random() * 100.);
    }

}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.facade;

/**
 *
 * @author Adriano Gonçalves
 */
public class IoTSystem implements SensorInformation {

    @Override
    public String getStatus() {
        TemperatureSensor temperatureSensor = new TemperatureSensor();
        HumiditySensor humiditySensor = new HumiditySensor();
        LuminositySensor luminositySensor = new LuminositySensor();

        float temperature = temperatureSensor.readValue();
        float humidity = humiditySensor.readValue();
        float luminosity = luminositySensor.readValue();

        if (temperature > 35. && humidity < 20 && luminosity > 70) {
            return "Desert feelings";
        } else if (temperature > 35. && humidity > 80 && luminosity < 50) {
            return "Rainning tropical forest";
        } else if (humidity < 30) {
            return "Kinda dry.";
        } else if (temperature < -30.) {
            return "Are you in Siberia??";
        } else {
            return "ok";
        }
    }

}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.facade;

/**
 *
 * @author Adriano Gonçalves
 */
public class Principal {

    public static void main(String[] args) {
        SensorInformation atmosphereAvaliation = new IoTSystem();

        System.out.println("Atmosphere situation: " + atmosphereAvaliation.getStatus());
    }
}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.facade;

/**
 *
 * @author Adriano Gonçalves
 */
public class TemperatureSensor {

    public float readValue() {
        // Do something and return the result
        return (float) ((Math.random() * 100.) * (Math.random() < 0.5 ? 1. : -1.));
    }

}
Clique aqui para fazer o download do código completo de implementação deste Design Pattern.

Padrões Relacionados

Este Padrão pode ser usado para resolver os seguintes problemas: