Documente Academic
Documente Profesional
Documente Cultură
obiect
J Curs 8 – Composite, decorator
J Acest curs
› Composite
› Decorator
J Composite
› Şablonul Composite compune obiecte în structuri de tip arbore pentru a
reprezenta ierarhii parte-întreg. Şablonul permite clienţilor să trateze
uniform obiecte individuale şi compuneri de obiecte
– Pot fi ignorate diferenţele dintre obiectele compuse şi obiectele elementare
› Compune obiectele intr-o structura arborescenta
› Ofera clientului posibilitatea de a trata obiectele simple si compuse intr-
un mod uniform
› Se utilizeaza acolo unde aplicatia trebuie sa manipuleze o colectie
ierarhica de obiecte primitive si composite.
› Obiectele primitive si composite sunt tratate diferit dar interfata este
aceeasi
› Poate fi parcurs cu un iterator
J Composite - necesitate
› Aplicația trebuie să manipuleze o colecție ierarhică de obiecte
„primitive” și „compozite”. Prelucrarea unui obiect primitiv față de
unul composite se realizează în mod diferit. Nu se dorește
interogarea „tipului” fiecărui obiect înainte de procesare.
J Composite – how to
› Se definește o clasă de bază abstractă (componentă) care
implementează comportamentul ce trebuie exercitat uniform pe toate
obiectele primitive și compuse. Se definesc clasele Primitive și
Compozite ca fiind subclase ale clasei Component. Fiecare obiect
compozit are funcționalitatea ”oferită” doar de tipul abstract
Component.
› Se va utiliza acest șablon de fiecare dată când există componente
care la rândul lor pot avea componente.
› Metodele de gestionare a ”copiilor”: addChild (), removeChild
() ar trebui în mod normal să fie definite în clasa Composite. Totuși
este necesar de a trata uniform primitivele și compozitele motiv
pentru care metode sunt definite în clasa de componente abstracte.
J Composite - structure
› Composite ce conține
componente, fiecare dintre
ele putând fi un composite
› Meniu ce conține elemente
de meniu, fiecare dintre ele
putând fi un menu
› Directoare ce conține
fisiere, fiecare dintre ele
putând fi un director
J Composite - check list
› Se va verifica dacă problema poate fi reprezentată/gestionată într-o
maniera ierarhică
› Se vor împărții conceptele de domeniu în clase containere și clase
elemente
› Se va crea o clasă/interfață ce permite gestiunea/manevrarea atât a
containerelor cât si a elementelor în aceeași manieră
› Se vor declara clasa/clasele container si clasa/clase elemente ca
fiind într-o relație ”is a” cu clasa abstractă/interfața
› Se vor declara clasa/clasele container într-o relație ”has a” cu
interfața interfață/clasa abstractă
› Gestiunea elementelor se va realiza atât la nivel de elemente cât și
de containere.
J Composite - rules
› Composite si decorator au structură similară, ambele se bazează pe
compoziție recursivă
› Composite poate fi parcurs cu un iterator.
› Visitor poate efectua diverse operații asupra unui composite
J abstract public class TreeItem
{
Composite – exemplu 1
protected String name;
protected int level = 0;
J }
@Override
public void Detalii(){
System.out.println(" " + id + ", " + nume + ", " + post);
}
}
class Asistent implements Angajat{
private String nume;
@Override
public void Detalii(){
System.out.println(" " + id + ", " + nume );
}
}
class Manager implements Angajat{
private String nume;
private int id;
J private String post;
int rank;
Composite – exemplul 2
private List<Angajat> echipa = new ArrayList<Angajat>();
Manager( int id, String nume, String post, int rank){
this.nume = nume;
this.id = id;
this.post = post;
this.rank = rank;
}
public void add(Angajat a){ echipa.add(a); }
@Override
public void Detalii() {
for(int i = 0; i < rank; i++ ) { System.out.print(" "); }
System.out.println(id + ", " + post + ", " + nume + ", " + rank);
for(Angajat a:echipa){
for(int i = 0; i <= rank; i++ ) {
System.out.print(" ");
}
a.Detalii();
}
}
J Composite – exemplu 2
public class Main{
public static void main(String[] args){
Manager ceo = new Manager(100, "Satya Nadella", "Chief Executive Officer", 0);
ceo.add(new Asistent(12, "Julia Weiner", "Asistent manager"));
Manager man = new Manager(200, "Judson Althoff", "Executive Vice President -
Worldwide", 1);
man.add(new Programator(234, "Peggy Scott", ".Net"));
man.add(new Programator(345, "Harry Spencer", "C#"));
ceo.add(man);
man = new Manager(201, "Jean Hood", "Executive Vice President - Cloud", 1);
man.add(new Programator(698, "Kurt Hogan", "Java" ));
man.add(new Programator(356, "Jeff Smith", "Python"));
ceo.add(man);
ceo.Detalii();
}
}
J Composite - exemplu 2
@Override
public void draw() {
screen.draw();
}
}
class Border extends Decorator{
Border(Screen screen){
J Decorator }
super(screen);
@Override
public void draw(){
super.draw();
System.out.println("\twith border");
}
}
@Override
public void draw(){
super.draw();
System.out.println("\twith scroll bar");
}
}
System.out.println("\nAdd border:");
s = new Border(s);
s.draw();
System.out.println("\nAdd scrollbar:");
s = new Scrollbar(s);
s.draw();
System.out.println("\nAdd menu:");
s = new Menu(s);
s.draw();
}
}
Base object constrution:
Based window - Command
Add border:
Based window - Command
with title bar
with border
Add scrollbar:
Based window - Command
with title bar
with border
with scroll bar
Add menu:
Based window - Command
with title bar
with border
with scroll bar
with menu
J Decorator – test 2;
public class Main {
public static void main(String[] args) {
Screen s = new Menu(new Scrollbar(new Border(new Titlebar(new Window("Command")))));
s.draw();
}
}