Sablonul de proiectare Adapter

Descriere

Adapter este un sablon structural (cunoscut si sub denumirea de wrapper) utilizat pentru a translata interfata unei clase intr-o alta interfata. Sablonul adapter ajuta doua clase incompatibile sa conlucreze. O situatie in care acest sablon este util este cea in care o clasa ofera un set de servicii pe care il dorim dar nu implementeaza interfata corecta (dorita).

Diagrama UML

In figura de mai jos este reprezentaa relatia dintre clasele implicate in sablonul Adapter. Clasa Client trebuie sa utilizeze serviciile puse la dispozitie de OriginalClass , dar dintr-un motiv anume acestea trebui utilizate prin intermediul unei interfete ForcedInterface. In acest context rolul clasei Adapter este de a ascunde serviciile oferit de OriginalClass si de a le oferi prin intermediu unor metode intermediare.

Exemplu

In exemplul de mai jos FileManagerUtil joaca rolul OriginalClass iar FileManagerImpl joaca rolul de adapter.

import java.io.*;
import java.util.*;
 
interface FileManager {
    public String open(String s);
    public String close();
    public String read(int pos, int amount, byte[] data);
    public String write(int pos, int amount, byte[] data);
}
 
class FileManagerUtil {
 
    private RandomAccessFile f;
 
    public boolean openFile(String fileName) {
        System.out.println("Opening file: " + fileName);
        boolean success = true;
        return success;
    }
 
    public boolean closeFile() {
        System.out.println("Closing file");
        boolean success = true;
        return success;
    }
 
    public boolean writeToFile(String d, long pos, long amount) {
        System.out.print("Writing " + amount
                + " chars from string: " + d);
        System.out.println(" to pos: " + pos + " in file");
        boolean success = true;
        return success;
    }
 
    public String readFromFile(long pos, long amount) {
        System.out.print("Reading " + amount
                + " chars from pos: " + pos + " in file");
        return new String("dynamite");
    }
}
 
class FileManagerImpl extends FileManagerUtil implements
        FileManager {
 
    public String close() {
        return new Boolean(closeFile()).toString();
    }
 
    public String open(String s) {
        return new Boolean(openFile(s)).toString();
    }
 
    public String read(int pos, int amount, byte[] data) {
        return readFromFile(pos, amount);
    }
 
    public String write(int pos, int amount, byte[] data) {
        boolean tmp = writeToFile(new String(data), pos, amount);
        return String.valueOf(tmp);
    }
}
 
public class FileManagerClient {
 
    public static void main(String[] args) {
        FileManager f = null;
        String dummyData = "dynamite";
        f = new FileManagerImpl();
        System.out.println("Using filemanager: "
                + f.getClass().toString());
        f.open("dummyfile.dat");
        f.write(0, dummyData.length(), dummyData.getBytes());
        String test = f.read(0, dummyData.length(),
                dummyData.getBytes());
        System.out.println("Data written and read: " + test);
        f.close();
    }
}

Rezultatul rularii codului:

c:>Opening file: dummyfile.dat
c:>Writing 8 chars from string: dynamite to pos: 0 in file
c:>Reading 8 chars from pos: 0 in fileData written and read: dynamite
c:>Closing file