Skip to main content

Servant (Design Pattern) in Java - example

The servant design pattern - or better idiom is used to provide the functionality (methods) to some group of objects. This functionality is common for all these object and therefor should not be repeated in every of these classes.
The object, which should be served is passed to the method of servant as a parameter. All the served objects should implement common interface - in this particular example IMovable interface. Also the type of argument passed to the servand method is of type IMovable.
The servant in this example is used to move objects from one position to another. In real life application these methods should change the position of object in small steps so that the final change would look like smooth movement (animation). In my servant method, only some message are printed instead for demonstration.
IMovable interface:
package com.shimon.servant;

import java.awt.Point;

/**
 * Movable interface
 * @author shimon
 *
 */
public interface IMovable {
 
 public void setPosition(Point p);
 
 public Point getPosition();
  
}
Implementation (Triangle.java):
package com.shimon.servant.objects;

import java.awt.Point;

import com.shimon.servant.IMovable;

public class Triangle implements IMovable {

 private int sideA;
 private int sideB;
 private int sideC;
 
 
 Point position = null;
 
 public Triangle(int sideA,int sideB,int sideC,Point p){
  this.sideA = sideA;
  this.sideB = sideB;
  this.sideC = sideC;
  this.position = p;
 }
 
 @Override
 public void setPosition(Point p) {
  this.position = p;
 }

 @Override
 public Point getPosition() {
  return this.position;
 }

 public int getSideA() {
  return sideA;
 }

 public void setSideA(int sideA) {
  this.sideA = sideA;
 }

 public int getSideB() {
  return sideB;
 }

 public void setSideB(int sideB) {
  this.sideB = sideB;
 }

 public int getSideC() {
  return sideC;
 }

 public void setSideC(int sideC) {
  this.sideC = sideC;
 }

}
Servant class (Mover.java)
package com.shimon.servant;

import java.awt.Point;

/**
 * Mover servant - moves the provided IMovable objects to specified position or increases their x an y axis position 
 * using the provided arguments.
 * @author shimon
 *
 */
public class Mover {
 
 /**
  * Private constructor
  */
 private Mover(){};
 
 /**
  * Move movable object to specified position.
  * @param moved - moved object
  * @param position - final position
  */
 public static void moveTo(IMovable moved, Point position){
  Point previousPosition = moved.getPosition();
  System.out.printf("Moving smoothly from position x=%d,y=%d to position x=%d,y=%d \n",
    previousPosition.x,
    previousPosition.y,
    position.x,
    position.y);
  moved.setPosition(position);
 }
 
 /**
  * Move movable object by specified distances.
  * @param moved - object to be moved
  * @param x - difference in x-axis
  * @param y - difference in y-axis
  */
 public static void moveBy(IMovable moved, int x, int y){
  Point previousPosition = moved.getPosition();
  System.out.printf("Moving smoothly from position x=%d,y=%d to position x=%d,y=%d \n",
    previousPosition.x,
    previousPosition.y,
    previousPosition.x + x,
    previousPosition.y + y);
  moved.setPosition(new Point(previousPosition.x + x, previousPosition.y + y));
 }
}
The servant method call is showed in the JUnit test method.
package com.shimon.servant;

import static org.junit.Assert.*;

import java.awt.Point;

import org.junit.Test;

import com.shimon.servant.objects.Rectangle;
import com.shimon.servant.objects.Square;
import com.shimon.servant.objects.Triangle;

public class MoverTest {

 @Test
 public void test() {
  Triangle triangle = new Triangle(1, 3, 2, new Point(-1,0));
  Square square = new Square(2, 4, new Point(2,5));
  Rectangle rec = new Rectangle(4, 3, new Point(-3,6));
  Mover.moveTo(rec, new Point(3,2));
  //assert equals on new position of rectangle object
  assertEquals(new Point(3,2), rec.getPosition());
  Mover.moveBy(square, 2, 4);
  assertEquals(new Point(4,9), square.getPosition());
  Mover.moveTo(triangle, new Point(-4,0));
  assertEquals(new Point(-4,0), triangle.getPosition());
 }

}
Console output:
Moving smoothly from position x=-3,y=6 to position x=3,y=2 
Moving smoothly from position x=2,y=5 to position x=4,y=9 
Moving smoothly from position x=-1,y=0 to position x=-4,y=0 

Comments

Popular posts from this blog

Jesenné Tatry 2011

O tom, že jeseň v horách - a to dokonca v slovenských najvyšších horách - nemusí byť len sychravá, upršaná a šedivá sme sa presvedčili počas uplynulého víkendu spolu so Zuzkou, mojimi kolegami a kamarátmi. Výhľad na všetky svetové strany, boľavé nohy a opálené tváre sú toho dôkazom. Väčšina z nás už skúsenosti s Tatrami mala, avšak aj tak sme to s túrami nechceli príliš prehnať (v pondelok predsa len treba ísť opäť do práce). Ako jedného z najlepších kandidátov na túru sme vybrali tatranskú klasiku - Rysy Rysy Ubytovanie na Štrbskom plese nám zabezpečilo pohodlný ranný začiatok túry, nakoľko sme na izbu prišli už v piatok večer. V sobotu okolo osmej sme už šľapali po ceste na Popradské pleso. Túto cestu pozná snáď každý, kto podnikal nejakú tú túru do Tatier. Ako každá túra na Rysy aj táto bola vďaka nádhernému počasiu masovou akciou. Húfy ľudí sa hrnuli strminou na Chatu pod Rysmi, o vrchole ani nehovorím. V momente keď sme dorazili na vrchol to na ňom vyzera skôr ako na bidle, na ...

pred oknom, za oknom

dnes rano som sa zobudil do uplne normalneho rana. po neustale sa opakujucom vyzvanani mojho budika som sa konecne postavil z postele. odtackal som sa do kuchyne aby som si spravil ranajky a kedze som mal este trochu casu nazvys isiel som si sadnut do obyvacky aby som si popri jedeni pozrel co je nove vo svete. ked sa tu zrazu za nasim oknom prechadza chlap... ono by to nebola situacia vobec nezvycajna, keby sme nebyvali na siedmom poschodi panelaku. po par sekundach som sa vsak spamatal a zistil som co je vo veci. cely nas cinziak stavebna firma zatepluje :) co dodat? - trochu vzrusenia na rano nezaskodi .

Fujarový workshop

Po prudkom začiatku týždňa som sa až dnes dostal k písaniu príspevku o mojom predchádzajúcom víkende. Ten bol zvláštny najmä tým, že sme ako kapela boli súčasťou fujarového workshopu v Zázrivej. Ako sme sa k takejto akcii vôbec dostali? Nuž poznáme sa so správnymi ľuďmi. Teda s fujarášmi, ktorí toto podujatie organizujú už po druhý raz. Aj kvôli tomu, že ich poznáme, a že sú to fajn ľudia sme sa rozhodli im s touto akciou trochu pomôcť. Sami sme vlastne nevedeli, čo presne sa od nás ako kapely bude očakávať. Nakoniec to však dopadlo všetko takmer ideálne. Ráno sme zavítali do dedinky Zázrivá a hneď po vystúpení z auta nás na Jánošíkovom dvore vítali z každej strany zvuky cvičiacich fujarášov. Na workshope sa zúčastnilo približne 10 ľudí, ktorý sa buď chcú naučiť na fujare hrať alebo ich vyrábať. Dvor bol však plný okoloidúcich, ktorí sa prišli pozrieť na toto zaujímavé podujatie. Z našej strane išlo najmä o zvučenie a sprievod majstrov fujarášov Jara Slobodu a Dušana Holíka....