Definição: É um padrão que permite que duas interfaces não relacionadas trabalhem em conjunto. O link entre elas é feito pela classe adaptadora.

Quando usar:

  • Quando você precisa ter nomes de métodos diferentes (entre os chamados e os executados);
  • Quando você quer ter diferentes conjuntos de métodos (para propósitos diferentes);
  • Quando quiser criar classes reusáveis.
padrão adapter

Como usar:

  • Criar uma classe Adapter que implemente Adaptee e ITarget;
  • Implementar Request de modo que ele execute SpecificRequest.

using System;
using System.Threading;
namespace _50minutos_adapter
{
    class Program
    {
        static void Main(string[] args)
        {
            IAparelho a =
                 new Liquidificador();
            Console.WriteLine(a.On());
            Console.WriteLine(a.Off());
            Console.WriteLine();
            a = new Lavadora();
            Console.WriteLine(a.On());
            Console.ReadKey();
        }
    }
    //Adaptee
    class TomadaABNT
    {
        //SpecificRequest
        private bool ligado;
        public bool Ligado
        {
            get
            {
                return this.ligado;
            }
            set
            {
                this.ligado = value;
                Console.WriteLine(">>> {0}ligando", this.ligado ? "" : "des");
            }
        }
    }
    //ITarget
    interface IAparelho
    {
        //Request
        String On();
        //Request
        String Off();
    }
    //Adapter
    class Liquidificador : TomadaABNT, IAparelho
    {
        //Request
        public String On()
        {
            this.Ligado = true;
            return "o liquidificador está ligado";
        }
        //Request
        public String Off()
        {
            this.Ligado = false;
            return "o liquidificador está desligado";
        }
    }
    class Lavadora : TomadaABNT, IAparelho
    {
        //Request
        public String On()
        {
            this.Ligado = true;
            Console.WriteLine("a lavadora está lavando roupas");
            this.Lavar();
            this.Centrifugar();
            this.Enxaguar();
            this.Centrifugar();
            this.Enxaguar();
            this.Centrifugar();
            return this.Off();
        }
        //Request
        public String Off()
        {
            this.Ligado = false;
            return "agora a lavadora está desligada";
        }
        public void Lavar()
        {
            Console.WriteLine("\tadicionando água e sabão em pó...");
            Thread.Sleep(2000);
            Console.WriteLine("\tlavando...");
        }
        private void Enxaguar()
        {
            Thread.Sleep(1000);
            Console.WriteLine("\tenxaguando...");
        }
        private void Centrifugar()
        {
            Thread.Sleep(1000);
            Console.WriteLine("\tcentrifugando...");
        }
    }
}