Program to demonstrate how to implement Composite Design Pattern in Java.
1. Geographical.java
2. Country.java
3. State.java
Output of the program :
1. Geographical.java
package com.hubberspot.designpattern.structural.composite; // This acts as a interface for every State(Leaf) and // Country(Composite) public abstract class GeographicalArea { // Name of the region private String areaName; public GeographicalArea(String areaName) { this.areaName = areaName; } public String getAreaName() { return areaName; } // Create methods which will throw UnsupportedOperationException public void addGeographicalArea(GeographicalArea geographicalArea) { throw new UnsupportedOperationException( "Invalid Operation. Not Supported"); } public GeographicalArea getGeographicalArea(int areaIndex) { throw new UnsupportedOperationException( "Invalid Operation. Not Supported"); } public long getPopulation() { throw new UnsupportedOperationException( "Invalid Operation. Not Supported"); } // Create a abstract method which will be implemented // by State and Country respectively public abstract void displayAreaInfo(); }
2. Country.java
package com.hubberspot.designpattern.structural.composite; import java.util.ArrayList; import java.util.List; // It extends GeographicalArea and has a list of // objects containing the GeographicalArea such as // State in this case. public class Country extends GeographicalArea { List< GeographicalArea > listOfGeographicalArea = new ArrayList< GeographicalArea >(); public Country(String areaName) { super(areaName); } // adding states to country @Override public void addGeographicalArea(GeographicalArea geographicalArea) throws UnsupportedOperationException { listOfGeographicalArea.add(geographicalArea); } // getting states one by one based on index @Override public GeographicalArea getGeographicalArea(int areaIndex) throws UnsupportedOperationException { return listOfGeographicalArea.get(areaIndex); } // displaying the information for the country @Override public void displayAreaInfo() { System.out.println("Country name : " + getAreaName()); System.out.println("It has following info : "); long totalPopulation = 0; int index = 1; System.out.println("It has following states : "); for(GeographicalArea geographicalArea : listOfGeographicalArea) { System.out.println(index + " : "+ geographicalArea.getAreaName() ); System.out.println("It has population around : " + geographicalArea.getPopulation()); totalPopulation = totalPopulation + geographicalArea.getPopulation(); index++; } System.out.println("Total Population of "+ getAreaName()+ " is : " + totalPopulation); } }
3. State.java
package com.hubberspot.designpattern.structural.composite; //It extends GeographicalArea public class State extends GeographicalArea { // has a property called as population private long population; public long getPopulation() { return population; } public State(String areaName, long population) { super(areaName); this.population = population; } // displaying the information for the states @Override public void displayAreaInfo() { System.out.println("State name : " + getAreaName()); System.out.println("State population : " + getPopulation()); } }4. TestCompositePattern.java
package com.hubberspot.designpattern.structural.composite; public class TestCompositePattern { public static void main(String[] args) { // Create two countries such as India and USA GeographicalArea countryIndia = new Country("India"); GeographicalArea countryUSA = new Country("USA"); // Create two Indian States with name and population GeographicalArea stateMadhyaPradesh = new State("Madhya Pradesh", 10000000); GeographicalArea stateMaharashtra = new State("Maharashtra", 20000000); // Create two USA States with name and population GeographicalArea stateNewYork = new State("New York", 19570261); GeographicalArea stateWashington = new State("Washington", 6897012); // Add the Indian States to India countryIndia.addGeographicalArea(stateMadhyaPradesh); countryIndia.addGeographicalArea(stateMaharashtra); // Add the USA States to USA countryUSA.addGeographicalArea(stateNewYork); countryUSA.addGeographicalArea(stateWashington); // Display Info for country India countryIndia.displayAreaInfo(); System.out.println(); // Display Info for country USA countryUSA.displayAreaInfo(); } }
Output of the program :