Sunteți pe pagina 1din 8

Paradigme de Programare Laboratorul 11

Laboratorul 11
11.1. abloane structurale
abloanele structurale se ocup de modul n care sunt compuse clasele i obiectele pentru a forma structuri mai complexe. abloanele structurale de clas folosesc motenirea pentru a compune interfee sau implementri. Un exemplu este ablonul Adapter. Acesta realizeaz o interfa conform cu alta, oferind o abstractizare uniform pentru interfee diferite. Un adaptor de clas realizeaz aceasta prin motenirea privat de la o clas adaptat, exprimnd apoi interfaa sa n termenii adaptatului. abloanele structurale de obiect descriu moduri de compunere a obiectelor n scopul obinerii de funcionaliti noi. 11.1.1. Adapter - ablon structural de clas sau de obiect 1) Definiie Transform interfaa unei clase ntr-o alt interfa cu scopul de a uura compatibilitatea i reutilizarea unor clase diferite dintr-o aplicaie. ablonul mai este cunoscut i sub numele de Wrapper. 2) Aplicabilitate i beneficii Conceptul unui adaptor este simplu: crem o clas care are interfaa dorit, iar apoi facem acea clas s comunice cu o clas care are o interfa diferit. Cnd se aplic - Se dorete utilizarea unei clase existente, dar a crei interfa nu corespunde cu cea dorit - Se dorete crearea unei clase reutilizabile care s poat coopera cu clase nenrudite, care nu au interfee compatibile Avantaje - O clas Adapter poate redefini parial comportarea clasei Adapted (fiind o subclas a acesteia). - Un obiect Adapter permite unei singure clase Adapter s lucreze cu mai multe clase Adapted i poate aduga funcionalitate la acestea. O clas Adater adapteaz o clas concret Adapted i prin urmare nu va funciona atunci cnd se dorete adaptarea unei clase cu toate subclasele sale. n cazul obiectelor Adapter devine dificil

Paradigme de Programare Laboratorul 11 redefinirea comportamentului clasei Adapted, pentru aceasta fiind necesar crearea de subclase Adapted iar Adapter-ul s trimit cererile de la Client ctre acestea. 3) Structura ablon de clas

ablon de obiect

4) Participani Target Specific interfaa necesar, care va fi utilizat de Client Client 2

Paradigme de Programare Laboratorul 11 Comunic cu obiecte adaptate folosindu-se de interfaa dat de Target Adapted Interfa existent ce necesit adaptat pentru a putea fi folosit de ctre Client Adapter Adapteaz interfaa Adapted la cea dorit, specificat de Target Clienii lucreaz cu instane Adapter, care la rndul lor apeleaz din Adaped operaiile corespunztoare cererilor venite de la Client.

11.2. Exemple
11.2.1. Exemplu de Adapter n Java API n API-ul Java ntlnim un set de clase Adapter cunoscute i utile totodat: WindowAdapter, ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter and MouseMotionAdapter. De exemplu interfaa WindowListener are 7 metode. Oricnd avem nevoie ca o clas s implementeze o astfel de interfa trebuie s implementm toate metodele dei de cele mai multe ori avem nevoie de doar una sau dou dintre acestea. n schimb, dac n loc s implementm interfaa WindowListener extindem clasa WindowAdapter, putem implementa doar acele metode care ne sunt utile. Iat interfaa util (Adapted) i clasa ce o implementeaz (Adapter):
public interface Windowlistener { public void windowClosed(WindowEvent e); public void windowOpened(WindowEvent e); public void windowIconified(WindowEvent e); public void windowDeiconified(WindowEvent e); public void windowActivated(WindowEvent e); public void windowDeactivated(WindowEvent e); public void windowClosing(WindowEvent e); } public class WindowAdapter implements WindowListner{ public void windowClosed(WindowEvent e){} public void windowOpened(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} public void windowClosing(WindowEvent e){} }

Pentru a testa acest principiu putem folosi un mic program de test:


import javax.swing.*; import java.awt.event.*; class Test extends JFrame {

Paradigme de Programare Laboratorul 11


public Test () { setSize(200,200); setVisible(true); addWindowListener(new Closer()); } public static void main(String[] args) { new Test(); } class Closer extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } }

11.2.2. Exemplu extindere aplicaie Pattern-ul Adapter poate fi folosit atunci cnd vrem s refolosim clasele vechi, fcnd clasele noi compatibile cu acestea. De exemplu avem un sistem funcional i testat reprezentat generic prin interfaa Clean i clasele derivate din aceasta. Pentru a aduga o funcionalitate nou vom crea interfaa Extra care extinde interfaa iniial Clean i vom implementa noua interfa.
interface Clean { public void makeClean(); } class Office implements Clean{ public void makeClean() { System.out.println("Clean Office"); } } class Workshop implements Clean{ public void makeClean() { System.out.println("Clean Workshop"); } } interface Extra extends Clean{ public void takeCare(); } class Facility implements Extra{ public void makeClean() { System.out.println("Clean Facility"); } public void takeCare() { System.out.println("Care has been taken"); } } class Test { static void Jobs (Extra job) { if (job instanceof Clean) ((Clean)job).makeClean(); if (job instanceof Extra)

Paradigme de Programare Laboratorul 11


((Extra)job).takeCare(); } public static void main(String[] args) { Extra e = new Facility(); Jobs(e); Clean c1 = new Office(); Clean c2 = new Workshop(); c1.makeClean(); c2.makeClean(); e.makeClean(); } }

11.2.3. Exemplu Adapter pattern prin compunere Spre exemplu avem clasa Data care a fost conceput i bine testat anterior. Pentru a folosi aceast clas ntr-un sistem nou i pentru a extinde funcionalitatea acesteia, putem include o instan a clasei iniiale n noua clas:
class Data { public void add(Info){} public void delete(Info) {} public void modify(Info){} //... } // adaptarea clasei iniiale class AdaptData { Data data; public void add(Info i) { data.add(i); //more job } public void delete(Info i) { data.delete(i); //more job } public void modify(Info i) { data.modify(i); //more job } //... }

11.3. Tem
Presupunem o aplicaie n care este necesar introducerea unor date personale ale utilizatorilor, printre care i adresa. Asupra adresei este necesar aplicarea unui set de validri prin care se asigur un anumit grad de corectitudine. Iniial a fost conceput un sistem de validare pentru adresele din SUA, implementat n clasa USAddress. Metoda isValidAddress din aceast clas valideaz adresa, codul potal i codul statului. Aplicaia a necesitat extinderea validrii i asupra adreselor din Canada de exemplu. Pentru a uura i eventualele alte extinderi, se creeaz clasa abstract AddressValidator din care vor extinde toate clasele ce ofer validare de adres. 5

Paradigme de Programare Laboratorul 11 ns exist deja o clas ce ofer validare de adres pentru Canda: CAAddress, prin metoda isValidCanadianAddr. Aceasta este deja testat i verificat, nu poate fi modificat, dar totui dorim s o folosim. Pentru aceasta facem un Adapter: CAAddressAdapter. Acest Adapter extinde din AddressValidator, integrndu-se astfel n sistem i folosete clasa iniial CAAddress.

AddressValidator: ofera metoda abstract isValidAddress USAddress: ofer implementare pentru adresele din USA:
public boolean isValidAddress(String inp_address, String inp_zip, String inp_state) { if (inp_address.trim().length() < 10) return false; if (inp_zip.trim().length() < 5) return false; if (inp_zip.trim().length() > 10) return false; if (inp_state.trim().length() != 2) return false;

Paradigme de Programare Laboratorul 11


return true; }

CAAddress: implementarea iniial pentru adresele din Canada:


public inp_pcode, boolean isValidCanadianAddr(String inp_address, String

String inp_prvnc) { if (inp_address.trim().length() < 15) return false; if (inp_pcode.trim().length() != 6) return false; if (inp_prvnc.trim().length() < 6) return false; return true; }

CAAddressAdapter: Wrapper peste implementarea iniial:


private CAAddress objCAAddress; public CAAddressAdapter(CAAddress address) { objCAAddress = address; } public boolean isValidAddress(String inp_address, String inp_zip, String inp_state) { return objCAAddress .isValidCanadianAddr(inp_address, inp_state); } inp_zip,

Customer: clasa ce conine informaiile despre un client i care iniiaz validarea adresei:
class Customer { public static final String US = "US"; public static final String CANADA = "Canada"; private String address; private String name; private String zip; private String state; private String type; public boolean isValidCustomerAddress() { AddressValidator validator = null; if (type.equals(Customer.US)) { validator = new USAddress(); } if (type.equals(Customer.CANADA)) { CAAddress objCAAddress = new CAAddress(); CAAddressAdapter caAdapter CAAddressAdapter(objCAAddress);

new

Paradigme de Programare Laboratorul 11


validator = caAdapter; } if (validator == null) { return true; } else { return validator.isValidAddress(address, zip, state); } } public Customer(String _name, String _address, String _zip, String _state, String _type) { name = _name; address = _address; zip = _zip; state = _state; type = _type; } }

Completai clasele din diagram i realizai o aplicaie (grafic) de test prin care se introduc datele despre un utilizator (n special cele ce trebuie validate) i prin intermediul clasei Customer se face validarea acestor date.

S-ar putea să vă placă și