Služebník (návrhový vzor): Porovnání verzí
Smazaný obsah Přidaný obsah
m {Sloh} |
→Příklad: příklad s komentáři značka: editace z Vizuálního editoru |
||
Řádek 40:
=== Služebníka zná obsluhovaný objekt ===
V prvním případě ''Klient'' posílá ''Obsluhovanému'' zprávu se svým požadavkem. ''Obsluhovaný'' neumí nebo nechce na zprávu reagovat sám, a proto si 'pozve' ''Služebníka'', který mu pomůže požadovanou funkci realizovat, a předá se jeho metodě jako parametr. ''Klient' přitom vůbec nemusí vědět, že ''Obsluhovaný' použil služeb ''Služebníka'.
=== Služebníka zná klient ===
V druhém případě ''Klient'' ví, že ''Obsluhovaný'' objekt implementuje rozhraní'''<code>IObsluhovaný</code>''' a že klientem požadovanou službu umí splnit ''Služebník''. Zavolá proto ''Služebníka'' sám a předá mu ''Obsluhovaný'' objekt jako parametr. ''Obsluhovaný'' v tomto případě vůbec nemusí vědět, že je předáván jako parametr některé z metod ''Služebníka'' a že je následně obsluhován ''Služebníkem''.
== Příklad ==
Řádek 61 ⟶ 51:
<source lang="java">
// MoveServant je trida poskytujici funkcionalitu
public class Position {▼
// tridam implementujicim interface Movable
// Metoda, ktera presune jakoukoliv tridu implementujici Movable
// na zcela novou pozici
public int getX() { return xPosition; }▼
public
// nastavi novou pozici
serviced.setPosition(absolute);▼
public void add(PositionRelative relative) {▼
xPosition += relative.getX();▼
yPosition += relative.getY();▼
}
// Metoda, ktera presune jakoukoliv tridu implementujici Movable
public Position(int dx, int dy) {▼
// na pozici, posunutou v obou smerech o PositionRelative
public void move(Movable serviced, PositionRelative relative) {▼
// nacte aktualni absolutni pozici objektu serviced
Position position = serviced.getPosition();▼
// posune aktualni pozici Position o pozici relativni PositionRelative
position.add(relative);▼
// a aktualizuje vysledek
serviced.setPosition(position);▼
}
}
// Interface urcujici, co obsluhovane tridy musi implementovat, aby
public class PositionRelative {▼
// mohli byt obslouzeny servantem MoveServant
public interface Movable {
// metoda setPosition, ktera umoznuje presouvat Movable
public void setPosition(Position p);▼
public int getX() { return xPosition; }▼
// metoda getPosition, ktera umoznuje ziskat polohu
public int getY() { return yPosition; }▼
public Position getPosition();▼
public PositionRelative(int dx, int dy) {▼
}▼
}
// trojuhelnik implementujici rozhrani Movable
public class Triangle implements Movable {
private Position p; // pro urceni pozice trojuhelniku
@Override
public void setPosition(Position p) { // nastaveni pozice trojuhelniku
}
@Override
public Position getPosition() { // ziskani pozice trojuhelniku
}
}
// ctyrstran implementujici rozhrani Movable
public class Rectangle implements Movable {
private Position p; // pro urceni pozice ctyrstranu
@Override
public void setPosition(Position p) { // nastaveni pozice ctyrstranu
}
@Override
public Position getPosition() { // ziskani pozice ctyrstranu
}
}
// elipsa implementujici rozhrani Movable
public class Ellipse implements Movable {
private Position p; // pro urceni pozice elipsy
@Override
public void setPosition(Position p) { // nastaveni pozice elipsy
}
@Override
public Position getPosition() { // ziskani pozice elipsy
}
}
public
private int x; //souradnice x
▲public void setPosition(Position p);
private int y; //soursdnice y
▲public Position getPosition();
}▼
//pricte k absolutni pozici relativni
▲ public void add(PositionRelative relative) {
▲ }
x = sx;
y = sy;
▲ serviced.setPosition(absolute);
▲ }
}
▲public class PositionRelative { //relativni pozice/posunuti
▲public void move(Movable serviced, PositionRelative relative) {
private int x; //souradnice x
▲ Position position = serviced.getPosition();
private int y; //soursdnice y
▲ position.add(relative);
▲ serviced.setPosition(position);
}▼
public int getY() { return y; } //getter pro y
▲ public PositionRelative(int dx, int dy) { //konstruktor teto tridy
x = dx;
y = dy;
▲ }
}
</source>
|