JaiswalTraining

Get the online training



Corejava Servlet Jsp  Php  Hibernate  Ajax Web Service   Ejb2.1 Ejb3.0 Struts Struts2  JPA Spring Ibatis   JSF    JSF2.0  CoreJavaDesignPattern    Jquery  Flex J2EE-Design-Patterns  Jboss7  Maven  Contact Me                                                                                                                                                                        
            IGNOU SMU PTU Project                                           Training                                                                                                                              
              

Contact Us  0091- 9210721663         jaiswaltraining@gmail.com




Corejava
Servlet
Jsp
Php
Hibernate
Ajax
Web Service
Ejb2.1
Ejb3.0
Struts  
Struts2
JPA
Spring
Ibatis
JSF
JSF2.0
CoreJavaDesignPattern
Jquery
Flex
J2EE-Design-Patterns
Jboss7
Maven







Proxy Pattern
  • A proxy, in its most general form, is a class functioning as an interface to something else. The proxy could interface to anything: a network connection, a large
    object in memory, a file, or some other resource that is expensive or impossible to duplicate.
  • A well-known example of the proxy pattern is a reference counting pointer object.
  • In situations where multiple copies of a complex object must exist the proxy pattern can be adapted to incorporate the flywe11ight pattern in order to reduce the application's memory footprint. Typically one instance of the complex object is created, and multiple
    proxy objects are created, all of which contain
Purpose

  • Provide a surrogate or placeholder for another object to control access to it.
Application

  • A remote proxy provides a local representative for an object in a different address space.
  • A virtual proxy creates expensive objects on demand. The ImageProxy described in the Motivation is an example of such a proxy.
  • A protection proxy controls access to the original object. Protection proxies are useful when objects should have different access rights.
Examples of Visitor
  • The Proxy provides a surrogate or place holder to provide access to an object.
  •  A check or bank draft is a proxy for funds in an account. 
  • A check can be used in place of cash for making purchases and ultimately controls access to cash in the issuer's account

Example:-

NonOwnerInvocationHandler.java
package proxy.impl;
 
import java.lang.reflect.*;
 
public class NonOwnerInvocationHandler
implements 
InvocationHandler 
  PersonBean person;
 
  public NonOwnerInvocationHandler(PersonBean person) {
    this.person = person;
  }
 
  public Object invoke(Object proxy, Method method,
 Object
[] args
      throws IllegalAccessException {
  
    try {
      if (method.getName().startsWith("get")) {
        return method.invoke(person, args);
         else if (method.getName().equals("
setHotOrNotRating"
)) {
        return method.invoke(person, args);
      else if (method.getName().startsWith("set")) {
        throw new IllegalAccessException();
      
        catch (InvocationTargetException e) {
            e.printStackTrace();
        
    return null;
  }
}

OwnerInvocationHandler.java
package proxy.impl;
 
import java.lang.reflect.*;
 
public class OwnerInvocationHandler
 
implements InvocationHandler 
  PersonBean person;
 
  public OwnerInvocationHandler(PersonBean person) {
    this.person = person;
  }
 
  public Object invoke(Object proxy,
 Method method, Object
[] args
      throws IllegalAccessException {
  
    try {
      if (method.getName().startsWith("get")) {
        return method.invoke(person, args);
         else if (method.getName().equals("
setHotOrNotRating"
)) {
        throw new IllegalAccessException();
      else if (method.getName().startsWith("set")) {
        return method.invoke(person, args);
      
        catch (InvocationTargetException e) {
            e.printStackTrace();
        
    return null;
  }
}

PersonBean.java
package proxy.impl;

public interface PersonBean {
 
  String getName();
  String getGender();
  String getInterests();
  int getHotOrNotRating();
 
    void setName(String name);
    void setGender(String gender);
    void setInterests(String interests);
    void setHotOrNotRating(int rating)
 
}

PersonBeanImpl.java
package proxy.impl;

public class PersonBeanImpl
implements PersonBean {
  String name;
  String gender;
  String interests;
  int rating;
  int ratingCount = 0;
  
  public String getName() {
    return name;  
  
  
  public String getGender() {
    return gender;
  }
  
  public String getInterests() {
    return interests;
  }
   
  public int getHotOrNotRating() {
    if (ratingCount == 0return 0;
    return (rating/ratingCount);
  }
  
 
  public void setName(String name) {
    this.name = name;
  }
 
  public void setGender(String gender) {
    this.gender = gender;
  
  
  public void setInterests(String interests) {
    this.interests = interests;
  
  
  public void setHotOrNotRating(int rating) {
    this.rating += rating;  
    ratingCount++;
  }
}

MatchMakingTestDrive.java
package proxy.client;


import java.lang.reflect.*;
import java.util.*;

import proxy.impl.NonOwnerInvocationHandler;
import proxy.impl.OwnerInvocationHandler;
import proxy.impl.PersonBean;
import proxy.impl.PersonBeanImpl;

public class MatchMakingTestDrive {
  Hashtable datingDB = new Hashtable();
   
  public static void main(String[] args) {
    MatchMakingTestDrive test = new MatchMakingTestDrive();
    test.drive();
  }
 
  public MatchMakingTestDrive() {
    initializeDatabase();
  }

  public void drive() {
    PersonBean joe = getPersonFromDatabase("Joe Javabean")
    PersonBean ownerProxy = getOwnerProxy(joe);
    System.out.println("Name is " + ownerProxy.getName());
    ownerProxy.setInterests("bowling, Go");
    System.out.println("Interests set from owner proxy");
    try {
      ownerProxy.setHotOrNotRating(10);
    catch (Exception e) {
      System.out.println("Can't set rating from owner proxy");
    }
    System.out.println("Rating is " + ownerProxy.
getHotOrNotRating
());

    PersonBean nonOwnerProxy = getNonOwnerProxy(joe);
    System.out.println("Name is " + nonOwnerProxy.getName());
    try {
      nonOwnerProxy.setInterests("bowling, Go");
    catch (Exception e) {
      System.out.println("Can't set interests from
non owner proxy"
);
    }
    nonOwnerProxy.setHotOrNotRating(3);
    System.out.println("Rating set from non owner
 proxy"
);
    System.out.println("Rating is " + nonOwner
Proxy.getHotOrNotRating
());
  }

  PersonBean getOwnerProxy(PersonBean person) {
     
        return (PersonBeanProxy.newProxyInstance
              person.getClass().getClassLoader(),
              person.getClass().getInterfaces(),
                new OwnerInvocationHandler(person));
  }

  PersonBean getNonOwnerProxy(PersonBean person) {
    
        return (PersonBeanProxy.newProxyInstance(
              person.getClass().getClassLoader(),
              person.getClass().getInterfaces(),
                new NonOwnerInvocationHandler(person));
  }

  PersonBean getPersonFromDatabase(String name) {
    return (PersonBean)datingDB.get(name);
  }

  void initializeDatabase() {
    PersonBean joe = new PersonBeanImpl();
    joe.setName("Joe Javabean");
    joe.setInterests("cars, computers, music");
    joe.setHotOrNotRating(7);
    datingDB.put(joe.getName(), joe);

    PersonBean kelly = new PersonBeanImpl();
    kelly.setName("Kelly Klosure");
    kelly.setInterests("ebay, movies, music");
    kelly.setHotOrNotRating(6);
    datingDB.put(kelly.getName(), kelly);
  }
}

Output:-


Download Zip ncode

Example:

MainProxyApp.java
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;

public class MainProxyApp {
  public static void main(String[] args) {
    OrderIF order = new OrderProxy();
    Vector v = order.getAllOrders();
    v = order.getAllOrders();
    v = order.getAllOrders();
    v = order.getAllOrders();
  }
}

class OrderProxy implements OrderIF {

  private int counter = 0;

  public Vector getAllOrders() {
    Order order = new Order();
    counter++;

    long t1 = System.currentTimeMillis();
    Vector v = order.getAllOrders();
    long t2 = System.currentTimeMillis();
    long timeDiff = t2 - t1;
    String msg = "Iteration=" + counter +
"::Time=" 
+ timeDiff + "ms";

    //log the message
    FileUtil fileUtil = new FileUtil();
    fileUtil.writeToFile("log.txt", msg, true, true);

    return v;
  }
}

interface OrderIF {
  public Vector getAllOrders();
}

class Order implements OrderIF {
  public Vector getAllOrders() {
    FileUtil fileUtil = new FileUtil();
    Vector v = fileUtil.fileToVector("orders.txt");
    return v;
  }
}

class MiscUtil {

  public static boolean hasDuplicates(Vector v) {
    int i = 0;
    int j = 0;
    boolean duplicates = false;

    for (i = 0; i < v.size() 1; i++) {
      for (j = (i + 1); j < v.size(); j++) {
        if (v.elementAt(i).toString().equalsIgnoreCase(
            v.elementAt(j).toString())) {
          duplicates = true;
        }

      }

    }

    return duplicates;
  }

  public static Vector removeDuplicates(Vector s) {
    int i = 0;
    int j = 0;
    boolean duplicates = false;

    Vector v = new Vector();

    for (i = 0; i < s.size(); i++) {
      duplicates = false;
      for (j = (i + 1); j < s.size(); j++) {
        if (s.elementAt(i).toString().equalsIgnoreCase(
            s.elementAt(j).toString())) {
          duplicates = true;
        }

      }
      if (duplicates == false) {
        v.addElement(s.elementAt(i).toString().trim());
      }

    }

    return v;
  }

  public static Vector removeDuplicateDomains(Vector s) {
    int i = 0;
    int j = 0;
    boolean duplicates = false;
    String str1 = "";
    String str2 = "";

    Vector v = new Vector();

    for (i = 0; i < s.size(); i++) {
      duplicates = false;
      for (j = (i + 1); j < s.size(); j++) {
        str1 = "";
        str2 = "";
        str1 = s.elementAt(i).toString().trim();
        str2 = s.elementAt(j).toString().trim();
        if (str1.indexOf('@'> -1) {
          str1 = str1.substring(str1.indexOf('@'));
        }
        if (str2.indexOf('@'> -1) {
          str2 = str2.substring(str2.indexOf('@'));
        }

        if (str1.equalsIgnoreCase(str2)) {
          duplicates = true;
        }

      }
      if (duplicates == false) {
        v.addElement(s.elementAt(i).toString().trim());
      }

    }

    return v;
  }

  public static boolean areVectorsEqual(Vector a, Vector b) {
    if (a.size() != b.size()) {
      return false;
    }

    int i = 0;
    int vectorSize = a.size();
    boolean identical = true;

    for (i = 0; i < vectorSize; i++) {
      if (!(a.elementAt(i).toString().
equalsIgnoreCase
(b.elementAt(i)
          .toString()))) {
        identical = false;
      }
    }

    return identical;
  }

  public static Vector removeDuplicates(Vector a, Vector b) {

    int i = 0;
    int j = 0;
    boolean present = true;
    Vector v = new Vector();

    for (i = 0; i < a.size(); i++) {
      present = false;
      for (j = 0; j < b.size(); j++) {
        if (a.elementAt(i).toString().equalsIgnoreCase(
            b.elementAt(j).toString())) {
          present = true;
        }
      }
      if (!(present)) {
        v.addElement(a.elementAt(i));
      }
    }

    return v;
  }

}// end of class

class FileUtil {

  DataOutputStream dos;

  /*
   * Utility method to write a given text to a file
   */
  public boolean writeToFile(String fileName, String dataLine,
      boolean isAppendMode, boolean isNewLine) {
    if (isNewLine) {
      dataLine = "\n" + dataLine;
    }

    try {
      File outFile = new File(fileName);
      if (isAppendMode) {
        dos = new DataOutputStream(new FileOutputStream
(
fileName, true));
      else {
        dos = new DataOutputStream(new FileOutputStream(outFile));
      }

      dos.writeBytes(dataLine);
      dos.close();
    catch (FileNotFoundException ex) {
      return (false);
    catch (IOException ex) {
      return (false);
    }
    return (true);

  }

  /*
   * Reads data from a given file
   */
  public String readFromFile(String fileName) {
    String DataLine = "";
    try {
      File inFile = new File(fileName);
      BufferedReader br = new BufferedReader(new
InputStreamReader(
          new FileInputStream(inFile)));

      DataLine = br.readLine();
      br.close();
    catch (FileNotFoundException ex) {
      return (null);
    catch (IOException ex) {
      return (null);
    }
    return (DataLine);

  }

  public boolean isFileExists(String fileName) {
    File file = new File(fileName);
    return file.exists();
  }

  public boolean deleteFile(String fileName) {
    File file = new File(fileName);
    return file.delete();
  }

  /*
   * Reads data from a given file into a Vector
   */

  public Vector fileToVector(String fileName) {
    Vector v = new Vector();
    String inputLine;
    try {
      File inFile = new File(fileName);
      BufferedReader br = new BufferedReader(new InputStreamReader(
          new FileInputStream(inFile)));

      while ((inputLine = br.readLine()) != null) {
        v.addElement(inputLine.trim());
      }
      br.close();
    // Try
    catch (FileNotFoundException ex) {
      //
    catch (IOException ex) {
      //
    }
    return (v);
  }

  /*
   * Writes data from an input vector to a given file
   */

  public void vectorToFile(Vector v, String fileName) {
    for (int i = 0; i < v.size(); i++) {
      writeToFile(fileName, (Stringv.elementAt(i), true, true);
    }
  }

  /*
   * Copies unique rows from a source file to a destination file
   */

  public void copyUniqueElements(String sourceFile,
 String resultFile
) {
    Vector v = fileToVector(sourceFile);
    v = MiscUtil.removeDuplicates(v);
    vectorToFile(v, resultFile);
  }

// end FileUtil



           
 ProxyDisplay.java 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Label;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ProxyDisplay extends JFrame {
  public ProxyDisplay() {
    super("Display proxied image");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });

    JPanel p = new JPanel();
    getContentPane().add(p);
    p.setLayout(new BorderLayout());
    ImageProxy image = new ImageProxy("elliott.jpg",
 
321271);
    p.add("Center", image);
    p.add("North"new Label("    "));
    p.add("West"new Label("  "));
    setSize(370350);
    setVisible(true);
  }

  
  static public void main(String[] argv) {
    new ProxyDisplay();
  }
}
//==================================

class ImageProxy extends JPanel implements Runnable {
  int height, width;

  MediaTracker tracker;

  Image img;

  JFrame frame;

  Thread imageCheck; //to monitor loading
  

  public ImageProxy(String filename, int w, int h) {
    height = h;
    width = w;

    tracker = new MediaTracker(this);
    img = Toolkit.getDefaultToolkit().getImage(filename);
    tracker.addImage(img, 0)//watch for image loading

    imageCheck = new Thread(this);
    imageCheck.start()//start 2nd thread monitor

    //this begins actual image loading
    try {
      tracker.waitForID(01);
    catch (InterruptedException e) {
    }
  }

  
  public void paint(Graphics g) {
    if (tracker.checkID(0)) {
      height = img.getHeight(frame)//get height
      width = img.getWidth(frame)//and width

      g.setColor(Color.lightGray)//erase box
      g.fillRect(00, width, height);
      g.drawImage(img, 00this)//draw loaded image
    else {
      //draw box outlining image if not loaded yet
      g.setColor(Color.black);
      g.drawRect(11, width - 2, height - 2);
    }
  }

  
  public Dimension getPreferredSize() {
    return new Dimension(width, height);
  }

  //public int getWidth() {return width;}
  //public int getHeight(){return height;}
  
  public void run() {
    //this thread monitors image loading
    //and repaints when done
    //the 1000 msec is artifically long
    //to allow demo to display with delay
    try {
      Thread.sleep(1000);
      while (!tracker.checkID(0))
        Thread.sleep(1000);
    catch (Exception e) {
    }
    repaint();
  }
}


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;

public class RunProxyPattern {
  public static void main(String[] arguments) {
    System.out.println("Example for the Proxy pattern");
    System.out.println();
    System.out.println("This code will demonstrate
 the use of a Proxy to"
);
    System.out.println(" provide functionality in
place of its underlying"
);
    System.out.println(" class.");
    System.out.println();

    System.out
        .println(" Initially, an AddressBookProxy
object will provide"
);
    System.out.println(" address book support
without requiring that the"
);
    System.out
        .println(" AddressBookImpl be created.
This could potentially"
);
    System.out.println(" make the application
 run much faster, since the"
);
    System.out
        .println(" AddressBookImpl would need
 to read in all addresses"
);
    System.out.println(" from a file when it
 is first created."
);
    System.out.println();

    if (!(new File("data.ser").exists())) {
      DataCreator.serialize("data.ser");
    }
    System.out.println("Creating the AddressBookProxy");
    AddressBookProxy proxy = new AddressBookProxy("data.ser");
    System.out.println("Adding entries to the AddressBookProxy");
    System.out.println("(this operation can be done by the Proxy,
 without"
);
    System.out.println(" creating an AddressBookImpl object)");
    proxy.add(new AddressImpl("Sun Education [CO]""500 El
Dorado Blvd."
,
        "Broomfield""CO""80020"));
    proxy.add(new AddressImpl("Apple Inc.""1
 Infinite Loop"
,
        "Redwood City""CA""93741"));
    System.out.println("Addresses created. Retrieving
 an address"
);
    System.out
        .println("(since the address is stored by the
Proxy, there is"
);
    System.out
        .println(" still no need to create an AddressBookImpl
 object)"
);
    System.out.println();
    System.out.println(proxy.getAddress("Sun Education [CO]")
.getAddress
());
    System.out.println();

    System.out
        .println("So far, all operations have been handled
 by the Proxy,"
);
    System.out
        .println(" without any involvement from the
 AddressBookImpl."
);
    System.out.println(" Now, a call to the method
getAllAddresses will"
);
    System.out.println(" force instantiation of
AddressBookImpl, and will"
);
    System.out.println(" retrieve ALL addresses
that are stored."
);
    System.out.println();

    ArrayList addresses = proxy.getAllAddresses();
    System.out.println("Addresses retrieved.
Addresses currently stored:"
);
    System.out.println(addresses);
  }
}

interface Address extends Serializable {
  public static final String EOL_STRING = System
      .getProperty("line.separator");

  public static final String SPACE = " ";

  public static final String COMMA = ",";

  public String getAddress();

  public String getType();

  public String getDescription();

  public String getStreet();

  public String getCity();

  public String getState();

  public String getZipCode();

  public void setType(String newType);

  public void setDescription(String newDescription);

  public void setStreet(String newStreet);

  public void setCity(String newCity);

  public void setState(String newState);

  public void setZipCode(String newZip);
}

interface AddressBook {
  public void add(Address address);

  public ArrayList getAllAddresses();

  public Address getAddress(String description);

  public void open();

  public void save();
}

class FileLoader {
  public static Object loadData(File inputFile) {
    Object returnValue = null;
    try {
      if (inputFile.exists()) {
        if (inputFile.isFile()) {
          ObjectInputStream readIn = new ObjectInputStream(
              new FileInputStream(inputFile));
          returnValue = readIn.readObject();
          readIn.close();
        else {
          System.err.println(inputFile + " is a directory.");
        }
      else {
        System.err.println("File " + inputFile + "
does not exist."
);
      }
    catch (ClassNotFoundException exc) {
      exc.printStackTrace();
    catch (IOException exc) {
      exc.printStackTrace();
    }
    return returnValue;
  }

  public static void storeData(File outputFile, Serializable data) {
    try {
      ObjectOutputStream writeOut = new ObjectOutputStream(
          new FileOutputStream(outputFile));
      writeOut.writeObject(data);
      writeOut.close();
    catch (IOException exc) {
      exc.printStackTrace();
    }
  }
}

class DataCreator {
  private static final String DEFAULT_FILE = "data.ser";

  public static void main(String[] args) {
    String fileName;
    if (args.length == 1) {
      fileName = args[0];
    else {
      fileName = DEFAULT_FILE;
    }
    serialize(fileName);
  }

  public static void serialize(String fileName) {
    try {
      serializeToFile(createData(), fileName);
    catch (IOException exc) {
      exc.printStackTrace();
    }
  }

  private static Serializable createData() {
    ArrayList items = new ArrayList();
    items.add(new AddressImpl("Home address",
"1418 Appian Way"
,
        "Pleasantville""NH""27415"));
    items.add(new AddressImpl("Resort""711 Casino Ave.",
"Atlantic City",
        "NJ""91720"));
    items.add(new AddressImpl("Vacation spot",
"90 Ka'ahanau Cir.",
        "Haleiwa""HI""41720"));
    return items;
  }

  private static void serializeToFile(Serializable
 data, String fileName
)
      throws IOException {
    ObjectOutputStream serOut = new ObjectOutputStream(
        new FileOutputStream(fileName));
    serOut.writeObject(data);
    serOut.close();
  }
}

class AddressImpl implements Address {
  private String type;

  private String description;

  private String street;

  private String city;

  private String state;

  private String zipCode;

  public static final String HOME = "home";

  public static final String WORK = "work";

  public AddressImpl() {
  }

  public AddressImpl(String newDescription,
String newStreet, String newCity,

      String newState, String newZipCode) {
    description = newDescription;
    street = newStreet;
    city = newCity;
    state = newState;
    zipCode = newZipCode;
  }

  public String getType() {
    return type;
  }

  public String getDescription() {
    return description;
  }

  public String getStreet() {
    return street;
  }

  public String getCity() {
    return city;
  }

  public String getState() {
    return state;
  }

  public String getZipCode() {
    return zipCode;
  }

  public void setType(String newType) {
    type = newType;
  }

  public void setDescription(String newDescription) {
    description = newDescription;
  }

  public void setStreet(String newStreet) {
    street = newStreet;
  }

  public void setCity(String newCity) {
    city = newCity;
  }

  public void setState(String newState) {
    state = newState;
  }

  public void setZipCode(String newZip) {
    zipCode = newZip;
  }

  public String toString() {
    return description;
  }

  public String getAddress() {
    return description + EOL_STRING + street +
EOL_STRING + city + COMMA

        + SPACE + state + SPACE + zipCode + EOL_STRING;
  }
}

class AddressBookProxy implements AddressBook {
  private File file;

  private AddressBookImpl addressBook;

  private ArrayList localAddresses = new ArrayList();

  public AddressBookProxy(String filename) {
    file = new File(filename);
  }

  public void open() {
    addressBook = new AddressBookImpl(file);
    Iterator addressIterator = localAddresses.iterator();
    while (addressIterator.hasNext()) {
      addressBook.add((AddressaddressIterator.next());
    }
  }

  public void save() {
    if (addressBook != null) {
      addressBook.save();
    else if (!localAddresses.isEmpty()) {
      open();
      addressBook.save();
    }
  }

  public ArrayList getAllAddresses() {
    if (addressBook == null) {
      open();
    }
    return addressBook.getAllAddresses();
  }

  public Address getAddress(String description) {
    if (!localAddresses.isEmpty()) {
      Iterator addressIterator = localAddresses.
iterator
();
      while (addressIterator.hasNext()) {
        AddressImpl address = (AddressImpl)
addressIterator.next();
        if (address.getDescription().
equalsIgnoreCase
(description)) {
          return address;
        }
      }
    }
    if (addressBook == null) {
      open();
    }
    return addressBook.getAddress(description);
  }

  public void add(Address address) {
    if (addressBook != null) {
      addressBook.add(address);
    else if (!localAddresses.contains(address)) {
      localAddresses.add(address);
    }
  }
}

class AddressBookImpl implements AddressBook {
  private File file;

  private ArrayList addresses = new ArrayList();

  public AddressBookImpl(File newFile) {
    file = newFile;
    open();
  }

  public ArrayList getAllAddresses() {
    return addresses;
  }

  public Address getAddress(String description) {
    Iterator addressIterator = addresses.iterator();
    while (addressIterator.hasNext()) {
      AddressImpl address = (AddressImpl)
addressIterator.next
();
      if (address.getDescription().
equalsIgnoreCase
(description)) {
        return address;
      }
    }
    return null;
  }

  public void add(Address address) {
    if (!addresses.contains(address)) {
      addresses.add(address);
    }
  }

  public void open() {
    addresses = (ArrayListFileLoader.loadData(file);
  }

  public void save() {
    FileLoader.storeData(file, addresses);
  }
}

Output:-


Download Zip code