Služebník (návrhový vzor): Porovnání verzí

Smazaný obsah Přidaný obsah
m {Sloh}
→‎Příklad: příklad s komentáři
Řá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'.
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''.
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
private int xPosition;
public class PositionMoveServant {
private int yPosition;
// Metoda, ktera presune jakoukoliv tridu implementujici Movable
 
// na zcela novou pozici
public int getX() { return xPosition; }
public intvoid getYmove()Movable {serviced, returnPosition yPosition;absolute) }{
// 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
xPosition = dx;
public void move(Movable serviced, PositionRelative relative) {
yPosition = dy;
// 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
private int xPosition;
public interface Movable {
private int yPosition;
// 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) {
xPosition = dx;
yPosition = 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
this.p = p;
}
 
@Override
public Position getPosition() { // ziskani pozice trojuhelniku
return this.p;
}
}
 
// 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
this.p = p;
}
 
@Override
public Position getPosition() { // ziskani pozice ctyrstranu
return this.p;
}
}
 
// 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
this.p = p;
}
 
@Override
public Position getPosition() { // ziskani pozice elipsy
return this.p;
}
}
 
public interfaceclass MovablePosition { //absolutni pozice
private int x; //souradnice x
public void setPosition(Position p);
private int y; //soursdnice y
public Position getPosition();
 
public int getX() { return xPositionx; } //getter pro x
public int getY() { return yPositiony; } //getter pro y
 
//pricte k absolutni pozici relativni
public void add(PositionRelative relative) {
xPosition x += relative.getX();
yPosition y += relative.getY();
}
 
public Position(int dxsx, int dysy) { //konstruktor teto tridy
public class MoveServant {
x = sx;
public void move(Movable serviced, Position absolute) {
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 getX() { return xPositionx; } //getter pro x
public int getY() { return y; } //getter pro y
 
public PositionRelative(int dx, int dy) { //konstruktor teto tridy
x = dx;
y = dy;
}
}
</source>