www.fatihkabakci.com

Personal Website and Computer Science TUR EN

ADAPTER DESIGN PATTERN

Last update: 1/16/2015 6:51:00 PM

Yazan:Fatih KABAKCI

Yapısal desenlerden(Structural pattern) biri olan Adapter tasarım deseni, birbirlerinden bağımsız iki ayrı yapıyı, araya mantıksal bir adaptörün girmesi ile konuşturabilen bir desen olarak karşımıza çıkar. Adapter tasarım desenindeki temel amaç, bir sınıfın kendisinde bulunmayan ama ihtiyaç duyulan bir özelliği için, sınıf iskeletini bozmadan, sadece eklenti yaparak ilgili özelliğe sahip olmasıdır. Normalde elbetteki bir sınıf bir özelliğe sahip olması gerekiyorsa, zaten tasarım aşamasında belirlenir. Ancak global ölçekteki yazılım projelerinde, bazen bir sınıfın gereksinimi önceden kestirilemeyebilir veya değişen koşullar altında yeni ihtiyaçlar belirlenebilir. Özellikle tasarım sonrasında, değişen ihtiyaca yönelik, bir adaptör mekanizmasına ihtiyaç duyulmuştur. Bu çoğu zaman farklı programcıların tasarladığı sınıfları, yine farklı programcılar tarafından kullanılmak istendiği zaman meydana gelir. Konuyu bir örnek üzerinden anlamaya çalışalım.

Aşağıda .mp3 formatındaki müzik dosyalarını çalabilen bir sınıfımız olsun. AudioPlayer adını verdiğimiz bu sınıf, MediaPlayer adında bir interface' i uygulamakta. Öte yandan, daha ileri teknolojiler olan mp4 ve vlc formatındaki müzik dosyalarını çalan sırasıyla Mp4Player ve VlcPlayer sınıfları bulunmaktadır. Bu sınıflarda AdvancedMediaPlayer adında başka bir interface' i uygulamakta. MediaPlayer ve AdvancedMediaPlayer arabirimleri birbirinden bağımsız olarak, kendi alt sınıflarında uygulanmaktadır. Buraya kadar anlatılan sistemimizin kodları aşağıda verilmektedir. Adapter tasarım desenini uygulamadan önce, sınıf ve arabirimlerimizin yerleşimini şu şekilde olacaktır.

Deseni uygulamadan önce - Before

MediaPlayer Arabirimi

package Adapter.Before;

/**
 * This interface provides base structure for media playing service.
 * 
 * @author www.fatihkabakci.com
 */
public interface MediaPlayer {
   public void play(String music);
}

AudioPlayer Sınıfı

package Adapter.Before;

import Adapter.MediaFormatDedector;

/**
 * This class can play mp3 music files. The AudioPlayer class implements the MediaPlayer interface and overrides the play method.
 * 
 * @author www.fatihkabakci.com
 */
public class AudioPlayer implements MediaPlayer {

   @Override
   public void play(String music) {
      if (MediaFormatDedector.verifyMediaFormat(".mp3", music)) {
         System.out.println(music + " is running as mp3 format");
      }
   }
}

AdvancedMediaPlayer Arabirimi

package Adapter.Before;

/**
 * This interface provides base structure for advanced media playing service such as mp4 and vlc.
 * 
 * @author www.fatihkabakci.com
 */
public interface AdvancedMediaPlayer {
   public void play(String music);
}

Mp4Player Sınıfı

package Adapter.Before;

import Adapter.MediaFormatDedector;

/**
 * This class can play mp4 music files. The Mp4Player class implements the AdvancedMediaPlayer interface and overrides the play method.
 * 
 * @author www.fatihkabakci.com
 */
public class Mp4Player implements AdvancedMediaPlayer {

   @Override
   public void play(String music) {
      if (MediaFormatDedector.verifyMediaFormat(".mp4", music)) {
         System.out.println(music + " is running as mp4 format");
      }
   }
}

VlcPlayer Sınıfı

package Adapter.Before;

import Adapter.MediaFormatDedector;

/**
 * This class can play vlc music files. The VlcPlayer class implements the AdvancedMediaPlayer interface and overrides the play method.
 * 
 * @author www.fatihkabakci.com
 */
public class VlcPlayer implements AdvancedMediaPlayer {

   @Override
   public void play(String music) {
      if (MediaFormatDedector.verifyMediaFormat(".vlc", music)) {
         System.out.println(music + " is running as vlc format");
      }
   }
}

Müzik çalar sınıflarında yardımcı rol olarak kullanılan MediaFormatDedector Sınıfı

package Adapter;
/**
 * This class checks the media format. All concrete media player classes use this.
 * 
 * @author www.fatihkabakci.com
 */
public class MediaFormatDedector {

   public static boolean verifyMediaFormat(String mediaType, String media) {
      int dotIndex = media.indexOf('.');
      String extension = media.substring(dotIndex);

      if (extension.equals(mediaType)) {
         return true;
      }
      return false;
   }
}

Şimdi, temel amacımız AudioPlayer sınıfını, mp4 ve vlc formatındaki müzik dosyalarını çalabilmesini de sağlamak. Adapter tasarım desenine göre, bir adaptör, adapte edilecek sınıfa(AudioPlayer) monte edilir. Adaptörün diğer ucu ise, hedef özelliğe sahip arabirim ile ilişkilendirilir. Bu, adaptörün, hedef arabirim(AdvancedMediaPlayer) referansına sahip olması ile sağlanır.

O halde bir adaptör sınıfına ihtiyacımız vardır. MediaAdapter adında tanımlanan bu sınıf aşağıda verilmektedir.

Deseni uyguladıktan sonra - After

MediaAdapter Sınıfı

package Adapter.After;

import Adapter.Before.AdvancedMediaPlayer;
import Adapter.Before.MediaPlayer;
import Adapter.Before.Mp4Player;
import Adapter.Before.VlcPlayer;

/**
 * The MediaAdapter class has an adapter role.
 * 
 * @author www.fatihkabakci.com
 */
public class MediaAdapter implements MediaPlayer {

   private AdvancedMediaPlayer amp;

   public MediaAdapter(String extension) {
      if (extension.equals(".mp4")) {
         amp = new Mp4Player();
      }
      else if (extension.equals(".vlc")) {
         amp = new VlcPlayer();
      }
      else {
         System.err.println("invalid media format");
      }
   }

   @Override
   public void play(String music) throws NullPointerException {
      amp.play(music);
   }
}

MediaAdapter sınıfı kritik 2 özelliğe sahiptir.

  1. + AudioPlayer sınıfının kullandığı arabirim olan MediaPlayer arabirimini aynen uygulaması
  2. + Özelliklerini kullanmak istediği sınıfların arabirimi olan AdvancedMediaPlayer arabirimini komposizyona dahil etmesi, yani onu bir sınıf üyesi gibi tanımlasıdır.

AudioPlayer Sınıfının Yeni Hali

package Adapter.After;

import Adapter.MediaFormatDedector;
import Adapter.Before.MediaPlayer;

/**
 * This class can also play mp4 and vlc music files helping an adapter. The AudioPlayer class continues to implement the MediaPlayer
 * interface. With using the Adapter Design Pattern, AudioPlayer class uses an adapter and it reaches the AdvancedMediaPlayer
 * objects helping this adapter. The else condition was added in the play method that was overridden in the last version of
 * AudioPlayer class. So, if a given music parameter has different from .mp3, adapter is active and calls own play method. Remember
 * that MediaAdapter class uses the AdvancedMediaPlayer interface as a class member.
 * 
 * @author www.fatihkabakci.com
 */
public class AudioPlayer implements MediaPlayer {

   MediaAdapter adapter;


   public AudioPlayer() {
   }

   public AudioPlayer(String extension) {
      adapter = new MediaAdapter(extension);
   }

   @Override
   public void play(String music) {
      if (MediaFormatDedector.verifyMediaFormat(".mp3", music)) {
         System.out.println(music + " is running as mp3 format");
      }

      else {
         try {
            adapter.play(music);
         }
         catch (NullPointerException npe) {
            System.err.println("The adapter is not active");
         }
      }

   }
}

AudioPlayer sınıfı, aslında yapısal anlamda bir değişikliğe uğratılmadan, sadece yeni bir özellik eklenerek, diğer müzik formatlarını desteklemesi sağlanmıştır. Aşağıda desenin istemci uygulaması verilmektedir.

Main Sınıfı

package Adapter;

import Adapter.After.AudioPlayer;
/**
 * This class shows that how Adapter Design Pattern is implemented.
 * 
 * @author www.fatihkabakci.com
 */
public class Client {
   public static void main(String[] args) {
      AudioPlayer mp3AudioPlayer = new AudioPlayer();
      mp3AudioPlayer.play("50cent.mp3");
      
      AudioPlayer mp4AudioPlayer = new AudioPlayer(".mp4");
      mp4AudioPlayer.play("50cent.mp4");
      
      AudioPlayer vlcAudioPlayer = new AudioPlayer(".vlc");
      vlcAudioPlayer.play("50cent.vlc");
      
      // not play
      vlcAudioPlayer.play("50cent.mp4");
      
      // not play
      mp4AudioPlayer.play("50cent.vlc");
      
      // play because of it is a audio player
      mp4AudioPlayer.play("50cent.mp3");
      
      // not play because of not active
      mp3AudioPlayer.play("50cent.mp4");
   }
}

Böylelikle AudioPlayer sınıfı, mp3 formatı haricindeki müzik formatlarını da(mp4 ve vlc), nasıl kullanacağını bilmek zorunda kalmadan, mediaAdaptor nesnesi üzerinden çalacaktır. Adapter Design Pattern, genelde tasarım sonrası ortaya çıkan bir takım ihtiyaçları kolaylıkla gidermek için kullanılmaktadır.

There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.