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

Thajsko 2018 - Ko Lanta (opičky a rybičky)

Aby sme v Thajsku nevynechali čistokrvné dovolenkové rezorty s plážami, vydali sme sa z Krabi (príspevok o Krabi nájdete tu ) na ostrov Lanta, ktorý sa nachádza asi 2 hodiny každý vanom od Krabi smerom na juh. Už cesta samotná bola zaujímavá. Prekvapil nás najmä "systém", akým tu verejná doprava funguje. Van vás väčšinou vyzdvihne u konkrétneho hotelu a pokračuje vyzdvihnúť ďalších spolucestujúcich. Nakoniec sme sa ešte zastavili na miestnej autobusovej stanici, kde šofér od nejakého pána prevzal zásielku pre nejakú pizzeriu po ceste (podľa krabice asi ingrediencie na pizzu). Cestou sme ešte párkrát rôzne zastavili a vyložili nejaký tovar. Takže taxíky tu v podstate fungujú aj ako kuriéri. Nikto žiadne meškanke príliš nerieši, väčšinou zastavia a s úsmevom vám to vysvetlia "Five minute, ok?". Okrem týchto zastávok sa nám cesta predĺžila o čakanie na kompu na Koh Lanta, takže to čo malo trvať asi 2 hodiny, trvalo viac než 3. Až tak nám to zase nevadilo, pretože t...

Pohoda 2010

Už sa to stáva pomaly pravidlom že v polovici júla každý rok pribudne na môj blog článok s nadpisom začinajúcim slovom Pohoda. I tento rok som si tento festival nenechal ujsť a i tento rok som neoľutoval ani jeden cent z ceny lístka. Tento rok som na festivale Bažant Pohoda bol už po piaty raz a pomaly sa stáva neodmysliteľnou súčasťou môjho leta. Na tento ročník som sa pripravoval poctivejšie ako na ten minulý. Dopredu som počúval rádio na stránke festivalu, aby som sa vedel aspoň približne rozhodnúť, ktorý z množstva koncertov si mám ísť pozrieť. Nakoniec sa mi samozrejme viaceré koncerty, ktoré som chcel vidieť kryli, niektoré boli zase v časoch okolo tretej nad ránom, takže pre mňa nebolo reálne ich vidieť po celodennom chodení po areáli (v teplotách okolo 30 stupňov Celzia). Tu a teraz by som chcel vyzdvihnúť niektoré kapely, ktorých vystúpenia sa mi tento rok páčili najviac. V prvom rade by to bola kapela " Sparrow and the Workshop ", ktorú by som jednoznačne zaradil...

proste pohoda

minuly vikend som sa uz po druhykrat zucastnil festivalu pohoda. o najkrajsie zazitky sa teda podelim aj s vami. ako to vsetko prebiehalo? na zaciatku sme si uz pocas cesty stanovili presne pravidla, ako napriklad :"do not talk with french girl on the back seat..." a podobne. hned po prichode na trencianske letisko sme sa co najrychlejsie zorientovali v programe festivalu a coskoro sme uz skumali areal festivalu z bezprostrednej blizkosti. no a nieco k programu. den prvy - piatok: pocas poobedia sme sa zucastnili na lekcii balkanskych tancov (celkom dobre na zahriatie; spolu s dzusom riedenym vodkou:) neskor sme sa isli napapat naspat k nasmu autu a po neuspesnom cakani na nasich kamaratov sme sa vecer vybrali na koncert 'dana bartu' ... , kvoli ktoremu som vlastne na pohodu isiel. no co povedat na jeho vykon, ani sa to neda popisat... treba vidiet. zbytok vecera a noci sme pobehovali medzi stageami a stankami so suvenirmi. pekny zazitok mam aj z koncertu ...