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

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

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

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

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

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

thumb|300px|center|Օբյեկտ ադապտեր ձևանմուշի UML դիագրամը: Ադապտերը թաքցնում է ադապտացված դասի ինտերֆեյսը հայցողից:

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

thumb|300px|center|Օբյեկտ ադապտեր ձևանմուշի UML դիագրամը

## Օրինակներ
### C#

```csharp
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 (ժառանգման միջոցով)

```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 (կոմպոզիցիայի միջոցով)

```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();
	}
	
}
```


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

Կատեգորիա:Ծրագրավորում