Friday, November 29

Observer design pattern in java

Lets talk about observer design pattern today--

Lets take in consideration a real time scenarion 

There is a News Control Center that controls current news and subscribers . 

Lets say there are two subscribers Ching and Chong

Ching and Chong are registered by News Control center for current news 

If at any point of time current news are updated News needs to be informed to its all subscribers. 

Subscriber will not keep on checking news all the time If any current news is updated. They will register once for all and News

will ensure that they are timely informed about every new news. So how will that hapend





Ching and Chong will act as observers / listener . News will see If any new news is updated it is informed to its subscribers 


Below Code details this and implement the scenario in java code .

NewsControlCenter Class will hold the main control to apply for subscriber registeration and bring in new news to the agency


==================



public class NewsControlCenter {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Subscriber sub1=new Subscriber("ching");
        Subscriber sub2=new Subscriber("chong");
        News news=new TimesNews();
        news.registerSubscriber(sub1);
        news.registerSubscriber(sub2);
        
        System.out.println("==========news changed======");

        news.updateNews("Narayan traced");
        
        System.out.println("==========news changed again ======");

        news.updateNews("Govt declared prize money on informing Narayan's whereabout.");

        
       
    }

}

==================


import java.util.List;

public interface News {
    void registerSubscriber(Subscriber sub);

    void unRegisterSubscriber(Subscriber sub);

    void updateNews(String news);
    void inform(Subscriber sub);
    void inform(List subs);
    void readCurrentNews();
}


==================








import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TimesNews implements News {

    String currentNews = "Asharam in Jail";

    List subscribers = new ArrayList();

    @Override
    public void registerSubscriber(Subscriber sub) {
        subscribers.add(sub);
    }

    @Override
    public void unRegisterSubscriber(Subscriber sub) {
        subscribers.remove(sub);
    }

    @Override
    public void updateNews(String news) {

        this.currentNews = news;
        inform(subscribers);

    }

    public void inform(Subscriber sub) {

    }

    public void inform(List subs) {

        for (Iterator iterator = subs.iterator(); iterator.hasNext();) {
            Subscriber subscriber = (Subscriber) iterator.next();
            inform(subscriber);
        }

    }

    public void readCurrentNews() {
        System.out.println(this.currentNews);
    }

}


=====================


-->


public class Subscriber {

    String name;

    public Subscriber(String name) {
        this.name = name;
    }

    public void readNews(News news) {

        System.out.println("Mr. " +name+ ": got this news:::");
        news.readCurrentNews();
}
}


=================



On executing this program as java application . Below logs will be written on console


----------------------------------------------------------

opening news for ::: ching
Asharam in Jail
opening news for ::: chong
Asharam in Jail
==========news changed======
Mr. ching: got this news:::
Narayan traced
Mr. chong: got this news:::
Narayan traced
==========news changed again ======
Mr. ching: got this news:::
Govt declared prize money on informing Narayan's whereabout.
Mr. chong: got this news:::
Govt declared prize money on informing Narayan's whereabout.

-------------------------------------------------------------------------------------

Wednesday, November 20

Once again on visitor's design pattern

I have two employees in my organization : Manoj and Kumar

I wish to have Manoj's employee  data in text format and Kumar's employee data in HTML format

What I would do to get it done :

1. I will create Employee instance called Manoj
2. I will ask Manoj to accept Textformatter as it's formatter
3. Once Manoj accept it , it will ask it's Formatter to apply text formatter on it's data

Code for this is as below :

------------------------------------------

package com;

public class Employee {

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    String name;

    public Employee() {
        // TODO Auto-generated constructor stub
    }

    public void accept(Formatter visitor) {

        visitor.visit(this);
    }

}
--------------------------------------------







package com;

public interface Formatter {
    
   void visit(Employee emp);
    
   String getResult();
}

------------------------------------------

package com;


public class TextFormat implements Formatter {
    
    String formatting;

    public TextFormat() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void visit(Employee emp) {
        
        formatting= "formatted the "+ emp.getName()+ " employee data in text format";
    }

    public String getResult(){
        
        return formatting;
    }

}

--------------------------------------------








package com;

public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        Employee emp =new Employee();
        
        Formatter visitor =new TextFormat();
        
        emp.setName("Manoj");
        emp.accept(visitor);
        
        System.out.println(visitor.getResult());
        
    
        
    }

}

----------------------------------------------


Similarly for Kumar to have it's data formatted in HTML format 

1. I will create Employee instance called Kumar
2. I will ask Kumar to accept HTMLformatter as it's formatter
3. Once KUMAR accept it , it will ask it's Formatter to apply HTML formatter on it's data 


Code for this is : 



---------------------------------------






package com;

public class HTMLFormat implements Formatter {

    String formatting;
    
    public HTMLFormat() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void visit(Employee emp) {
        formatting= "formatted the "+ emp.getName()+ " empolyee data in HTML format";
    }
    
    public String getResult(){
        return formatting;
    }

}

-----------------------------------

package com;

public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        Employee emp =new Employee();
        
        Formatter visitor =new TextFormat();
        
     
        
        visitor =new HTMLFormat();
        emp.setName("Kumar");

        emp.accept(visitor);
        
       System.out.println(visitor.getResult());
        
    }

}


-----------------------------------------



Test class to collectively apply formatters on Manoj and Kumar below Code could be used in single Test class:


----------------------------------------

package com;

public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        Employee emp =new Employee();
        
        Formatter visitor =new TextFormat();
        
        emp.setName("Manoj");
        emp.accept(visitor);
        
        System.out.println(visitor.getResult());
        
        visitor =new HTMLFormat();
        emp.setName("Kumar");

        emp.accept(visitor);
        
       System.out.println(visitor.getResult());
        
    }

}

-------------------------------