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

Hrebeňovka Nízkych Tatier za 4 dni

Nízke Tatry som ešte do nášho presunu do Žiliny a následneho sťahovania do Brna poznal z našich pohorí asi najlepšie. V dobe keď som ešte žil v Brezne ma myšlienka hrebeňovky príliš nenadchýnala, predsa len som to mal všetko za domom (takže tam môžem ísť kedykoľvek :). Ako to už ale väčšinou býva, človek si uvedomí čo mal, až keď to stratí - našťastie to nebola v tomto prípade žiadna tragická (či trvalá) strata, a tak sme sa spolu s Lukášom a Maťom rozhodli využiť tohoročné nádherné letné počasie na prechod z Telgártu na Donovaly po červenej značke a teda po hrebeni.

Kto nechce čítať ďalej a chce si pozrieť len fotky, nech pokračuje tu.


Vstávanie, cestovanie a ostrý štart Jednou z koplikovanejších otázok, bola práve otázka presunu zo Žiliny na Telgárt. Túru je potrebné začať čím skôr a preto do úvahy prichádzali len asi 2 spoje z Banskej Bystrici s prestupom v Brezne. Každopádne to pre nás znamenalo nastaviť si budík na 3:15, aby bolo reálne stihnúť autobus o pol šiestej ráno v Bystri…

Thajsko 2018 - Bangkok

Po minuloročnej dovolenkovej abstinencii sme si chceli so Zuzkou tento rok napraviť chuť nejakou exotickejšou destináciou. Podmienkami bolo, aby tam bolo teplo aj vtedy, keď je u nás ešte stále zima a aby sa tam dal robiť windsurfing. Druhá podmienka nejak začala s postupom času strácať na dôležitosti a výsledkom nakoniec bola 3 týždňová dovolenka v Thajsku.
Tentokrát som si povedal, že blog budem písať priebežne, aby boli dojmy čo najčerstvejšie. Ako asi každý kto bol v Thajsku sme začali našu cestu v Bangkoku. No, aby som bol presný, s 3 hodinovou prestávkou na najluxusnejšom letisku, aké som zatiaľ videl - v katarskej Dohe (nuž, nafta očividne stále vynáša). Aby sme využili hneď prvý večer, ubytovali sme sa v Bangkoku pomerne blízko k ulici Kao San, na ktorej sa koná slávny Kao San night market. Hneď po príchode sme sa tam vydali. Zážitok to bol teda intenzívny. 
Z každej strany na vás niekto máva nejakou ceduľou a pozýva vás na jedlo, drinky, jazdu tuktukom alebo čokoľvek iné. Za…