Ադապտեր (նախագծման ձևանմուշ)

Ադապտեր (), կառուցվածքային նախագծման ձևանմուշ, որը նախատեսված է օբյեկտի ֆունկցիաների կազմակերպման նպատակով հատուկ ինտերֆեյս ստեղծելու համար։

Ընդհանուր հասկացողություններ 
 Client - հայցող
 Instance - նմուշ
 Implementation - իրականացում
 Product - արգասիք

Նկարագրություն 
Ադապտերն համատեղում է երկու տարբեր ինտերֆեյսները։ Ինտերֆեյսները կարող են լինել անհամատեղելի, բայց ներքին ֆունկցիանալությունը պետք է համապատասխանի պահանջներին։ Ադապտերը թույլ է տալիս անհամատեղելի ինտերֆեյսներով դասերը համատեղել և այն բերել հայցողի պահանջված ինտերֆեյսին։

Կառուցվածք 
Գոյություն ունի երկու ձևի Ադապտեր ձևանմուշ.
 Օբյեկտ ադապտեր ձևանմուշ
 Դաս ադապտեր ձևանմուշ

Օբյեկտ ադապտեր ձևանմուշ 
Այս մոդելի դեպքում ադապտերն իր մեջ որպես դասի նմուշ պարունակում է փոփոխման ենթակա ինտերֆեյսով դասը։ Այս դեպքում ֆունկցիաների կանչն իրականավում է նմուշի համապատասխան ֆունկցիան կանչելով։

Դաս ադապտեր ձևանմուշ 
Այս տիպի ադապտերն օգտագործում է բազմակի պոլիֆորմ ինտերֆեյսների իրականացում կամ էլ ժառանգում է և՜ ադապտացնող դասը, և՜ ադապտացվողը։ Այսպիսով ստեղծվում է դաս միայն ինտերֆեյս ապահովելու համար։ Նման օրինակի ադապտերների օգտագործումը բնորոշ է այնպիսի ծրագրավորման լեզուներին, որոնք չեն ապահովում բազմակի ժառանգում (օրինակ Java)։

Օրինակներ

C# 
 using System;
 
 namespace Adapter
 {
  
  class MainApp
  {
    static void Main()
    {
      // Create adapter and place a request
      Target target = new Adapter();
      target.Request();
 
      // Wait for user
      Console.Read();
    }
  }
 
  // "Target"
 
  class Target
  {
    public virtual void Request()
    {
      Console.WriteLine("Called Target Request()");
    }
  }
 
  // "Adapter"
 
  class Adapter : Target
  {
    private Adaptee adaptee = new Adaptee();
 
    public override void Request()
    {
      // Possibly do some other work
      // and then call SpecificRequest
      adaptee.SpecificRequest();
    }
  }
 
  // "Adaptee"
 
  class Adaptee
  {
    public void SpecificRequest()
    {
      Console.WriteLine("Called SpecificRequest()");
    }
  }
 }

Java (ժառանգման միջոցով) 
// Target
public interface Chief
{
  public Object makeBreakfast();
  public Object makeLunch();
  public Object makeDinner();
}

// Adaptee
public class Plumber
{
  public Object getScrewNut()
  { ... }
  public Object getPipe()
  { ... }
  public Object getGasket()
  { ... }
}

// Adapter
public class ChiefAdapter extends Plumber implements Chief
{
  public Object makeBreakfast()
  {
    return getGasket();
  }
  public Object makeLunch()
  {
    return getPipe();
  }
  public Object makeDinner()
  {
    return getScrewNut();
  }
}

// Client
public class Client
{
  public static void eat(Object dish)
  { ... }

  public static void main(String[] args)
  {
    Chief ch = new ChiefAdapter();
    Object dish = ch.makeBreakfast();
    eat(dish);
    dish = ch.makeLunch();
    eat(dish);
    dish = ch.makeDinner();
    eat(dish);
    callAmbulance();
  }
}

Java (կոմպոզիցիայի միջոցով) 
// Ֆայլ Chief.java

public interface Chief {

	public Object makeBreakfast();
	public Object makeDinner();
	public Object makeSupper();
	
}

// Ֆայլ Plumber.java

public class Plumber {

	public Object getPipe(){
		return new Object();
	}
	
	public Object getKey(){
		return new Object();
	}
	
	public Object getScrewDriver(){
		return new Object();
	}
	
}

// Ֆայլ ChiefAdapter.java

public class ChiefAdapter implements Chief{

	private Plumber plumber = new Plumber();

	@Override
	public Object makeBreakfast() {
		return plumber.getKey();
	}

	@Override
	public Object makeDinner() {
		return plumber.getScrewDriver();
	}

	@Override
	public Object makeSupper() {
		return plumber.getPipe();
	}

}

// Ֆայլ Client.java

public class Client {

	public static void main (String [] args){
		Chief chief = new ChiefAdapter();
		
		Object key = chief.makeDinner();
	}
	
}

Ծանոթագրություններ 

Ծրագրավորում