Java/Design Pattern/Facade Pattern
Facade Pattern
<source lang="java">
/* Software Architecture Design Patterns in Java by Partha Kuchana Auerbach Publications
- /
</source>
Facade Pattern 2 in Java
<source lang="java">
//[C] 2002 Sun Microsystems, Inc.--- import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.NumberFormat; import java.util.HashMap; import java.util.Locale; import java.util.Properties; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class RunFacadePattern {
public static void main(String [] arguments){ System.out.println("Example for the Facade pattern"); System.out.println(); System.out.println("This code sample uses an InternationalizatgionWizard (a Facade)"); System.out.println(" to manage communication between the rest of the application and"); System.out.println(" a series of other classes."); System.out.println(); System.out.println("The InternationalizatgionWizard maintains a colleciton of Nation"); System.out.println(" objects. When the setNation method is called, the wizard sets the"); System.out.println(" default nation, updating the Currency, PhoneNumber and localized"); System.out.println(" String resources (InternationalizedText) available."); System.out.println(); System.out.println("Calls to get Strings for the GUI, the currency symbol or the dialing"); System.out.println(" prefix are routed through the Facade, the InternationalizationWizard."); System.out.println(); if (!(new File("data.ser").exists())){ DataCreator.serialize("data.ser"); } System.out.println("Creating the InternationalizationWizard and setting the nation to US."); System.out.println(); InternationalizationWizard wizard = new InternationalizationWizard(); wizard.setNation("US"); System.out.println("Creating the FacadeGui."); System.out.println(); FacadeGui application = new FacadeGui(wizard); application.createGui(); application.setNation(wizard.getNation("US")); }
} class FacadeGui implements ActionListener, ItemListener{
private static final String GUI_TITLE = "title"; private static final String EXIT_CAPTION = "exit"; private static final String COUNTRY_LABEL = "country"; private static final String CURRENCY_LABEL = "currency"; private static final String PHONE_LABEL = "phone"; private JFrame mainFrame; private JButton exit; private JComboBox countryChooser; private JPanel controlPanel, displayPanel; private JLabel countryLabel, currencyLabel, phoneLabel; private JTextField currencyTextField, phoneTextField; private InternationalizationWizard nationalityFacade; public FacadeGui(InternationalizationWizard wizard){ nationalityFacade = wizard; } public void createGui(){ mainFrame = new JFrame(nationalityFacade.getProperty(GUI_TITLE)); Container content = mainFrame.getContentPane(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); displayPanel = new JPanel(); displayPanel.setLayout(new GridLayout(3, 2)); countryLabel = new JLabel(nationalityFacade.getProperty(COUNTRY_LABEL)); countryChooser = new JComboBox(nationalityFacade.getNations()); currencyLabel = new JLabel(nationalityFacade.getProperty(CURRENCY_LABEL)); currencyTextField = new JTextField(); phoneLabel = new JLabel(nationalityFacade.getProperty(PHONE_LABEL)); phoneTextField = new JTextField(); currencyTextField.setEditable(false); phoneTextField.setEditable(false); displayPanel.add(countryLabel); displayPanel.add(countryChooser); displayPanel.add(currencyLabel); displayPanel.add(currencyTextField); displayPanel.add(phoneLabel); displayPanel.add(phoneTextField); content.add(displayPanel); controlPanel = new JPanel(); exit = new JButton(nationalityFacade.getProperty(EXIT_CAPTION)); controlPanel.add(exit); content.add(controlPanel); exit.addActionListener(this); countryChooser.addItemListener(this); mainFrame.addWindowListener(new WindowCloseManager()); mainFrame.pack(); mainFrame.setVisible(true); } private void updateGui(){ nationalityFacade.setNation(countryChooser.getSelectedItem().toString()); mainFrame.setTitle(nationalityFacade.getProperty(GUI_TITLE)); countryLabel.setText(nationalityFacade.getProperty(COUNTRY_LABEL)); currencyLabel.setText(nationalityFacade.getProperty(CURRENCY_LABEL)); phoneLabel.setText(nationalityFacade.getProperty(PHONE_LABEL)); exit.setText(nationalityFacade.getProperty(EXIT_CAPTION)); currencyTextField.setText(nationalityFacade.getCurrencySymbol() + " " + nationalityFacade.getNumberFormat().format(5280.50)); phoneTextField.setText(nationalityFacade.getPhonePrefix()); mainFrame.invalidate(); countryLabel.invalidate(); currencyLabel.invalidate(); phoneLabel.invalidate(); exit.invalidate(); mainFrame.validate(); } public void actionPerformed(ActionEvent evt){ Object originator = evt.getSource(); if (originator == exit){ exitApplication(); } } public void itemStateChanged(ItemEvent evt){ Object originator = evt.getSource(); if (originator == countryChooser){ updateGui(); } } public void setNation(Nation nation){ countryChooser.setSelectedItem(nation); } private class WindowCloseManager extends WindowAdapter{ public void windowClosing(WindowEvent evt){ exitApplication(); } } private void exitApplication(){ System.exit(0); }
} class Nation {
private char symbol; private String name; private String dialingPrefix; private String propertyFileName; private NumberFormat numberFormat; public Nation(String newName, char newSymbol, String newDialingPrefix, String newPropertyFileName, NumberFormat newNumberFormat) { name = newName; symbol = newSymbol; dialingPrefix = newDialingPrefix; propertyFileName = newPropertyFileName; numberFormat = newNumberFormat; } public String getName(){ return name; } public char getSymbol(){ return symbol; } public String getDialingPrefix(){ return dialingPrefix; } public String getPropertyFileName(){ return propertyFileName; } public NumberFormat getNumberFormat(){ return numberFormat; } public String toString(){ return name; }
} class Currency{
private char currencySymbol; private NumberFormat numberFormat; public void setCurrencySymbol(char newCurrencySymbol){ currencySymbol = newCurrencySymbol; } public void setNumberFormat(NumberFormat newNumberFormat){ numberFormat = newNumberFormat; } public char getCurrencySymbol(){ return currencySymbol; } public NumberFormat getNumberFormat(){ return numberFormat; }
} class DataCreator{
private static final String GUI_TITLE = "title"; private static final String EXIT_CAPTION = "exit"; private static final String COUNTRY_LABEL = "country"; private static final String CURRENCY_LABEL = "currency"; private static final String PHONE_LABEL = "phone"; public static void serialize(String fileName){ saveFrData(); saveUsData(); saveNlData(); } private static void saveFrData(){ try{ Properties textSettings = new Properties(); textSettings.setProperty(GUI_TITLE, "Demonstration du Pattern Facade"); textSettings.setProperty(EXIT_CAPTION, "Sortir"); textSettings.setProperty(COUNTRY_LABEL, "Pays"); textSettings.setProperty(CURRENCY_LABEL, "Monnaie"); textSettings.setProperty(PHONE_LABEL, "Numero de Telephone"); textSettings.store(new FileOutputStream("french.properties"), "French Settings"); } catch (IOException exc){ System.err.println("Error storing settings to output"); exc.printStackTrace(); } } private static void saveUsData(){ try{ Properties textSettings = new Properties(); textSettings.setProperty(GUI_TITLE, "Facade Pattern Demonstration"); textSettings.setProperty(EXIT_CAPTION, "Exit"); textSettings.setProperty(COUNTRY_LABEL, "Country"); textSettings.setProperty(CURRENCY_LABEL, "Currency"); textSettings.setProperty(PHONE_LABEL, "Phone Number"); textSettings.store(new FileOutputStream("us.properties"), "US Settings"); } catch (IOException exc){ System.err.println("Error storing settings to output"); exc.printStackTrace(); } } private static void saveNlData(){ try{ Properties textSettings = new Properties(); textSettings.setProperty(GUI_TITLE, "Facade Pattern voorbeeld"); textSettings.setProperty(EXIT_CAPTION, "Exit"); textSettings.setProperty(COUNTRY_LABEL, "Land"); textSettings.setProperty(CURRENCY_LABEL, "Munt eenheid"); textSettings.setProperty(PHONE_LABEL, "Telefoonnummer"); textSettings.store(new FileOutputStream("dutch.properties"), "Dutch Settings"); } catch (IOException exc){ System.err.println("Error storing settings to output"); exc.printStackTrace(); } }
} class PhoneNumber {
private static String selectedInterPrefix; private String internationalPrefix; private String areaNumber; private String netNumber; public PhoneNumber(String intPrefix, String areaNumber, String netNumber) { this.internationalPrefix = intPrefix; this.areaNumber = areaNumber; this.netNumber = netNumber; } public String getInternationalPrefix(){ return internationalPrefix; } public String getAreaNumber(){ return areaNumber; } public String getNetNumber(){ return netNumber; } public static String getSelectedInterPrefix(){ return selectedInterPrefix; } public void setInternationalPrefix(String newPrefix){ internationalPrefix = newPrefix; } public void setAreaNumber(String newAreaNumber){ areaNumber = newAreaNumber; } public void setNetNumber(String newNetNumber){ netNumber = newNetNumber; } public static void setSelectedInterPrefix(String prefix) { selectedInterPrefix = prefix; } public String toString(){ return internationalPrefix + areaNumber + netNumber; }
} class InternationalizedText{
private static final String DEFAULT_FILE_NAME = ""; private Properties textProperties = new Properties(); public InternationalizedText(){ this(DEFAULT_FILE_NAME); } public InternationalizedText(String fileName){ loadProperties(fileName); } public void setFileName(String newFileName){ if (newFileName != null){ loadProperties(newFileName); } } public String getProperty(String key){ return getProperty(key, ""); } public String getProperty(String key, String defaultValue){ return textProperties.getProperty(key, defaultValue); } private void loadProperties(String fileName){ try{ FileInputStream input = new FileInputStream(fileName); textProperties.load(input); } catch (IOException exc){ textProperties = new Properties(); } }
} class InternationalizationWizard{
private HashMap map; private Currency currency = new Currency(); private InternationalizedText propertyFile = new InternationalizedText(); public InternationalizationWizard() { map = new HashMap(); Nation[] nations = { new Nation("US", "$", "+1", "us.properties", NumberFormat.getInstance(Locale.US)), new Nation("The Netherlands", "f", "+31", "dutch.properties", NumberFormat.getInstance(Locale.GERMANY)), new Nation("France", "f", "+33", "french.properties", NumberFormat.getInstance(Locale.FRANCE)) }; for (int i = 0; i < nations.length; i++) { map.put(nations[i].getName(), nations[i]); } } public void setNation(String name) { Nation nation = (Nation)map.get(name); if (nation != null) { currency.setCurrencySymbol(nation.getSymbol()); currency.setNumberFormat(nation.getNumberFormat()); PhoneNumber.setSelectedInterPrefix(nation.getDialingPrefix()); propertyFile.setFileName(nation.getPropertyFileName()); } } public Object[] getNations(){ return map.values().toArray(); } public Nation getNation(String name){ return (Nation)map.get(name); } public char getCurrencySymbol(){ return currency.getCurrencySymbol(); } public NumberFormat getNumberFormat(){ return currency.getNumberFormat(); } public String getPhonePrefix(){ return PhoneNumber.getSelectedInterPrefix(); } public String getProperty(String key){ return propertyFile.getProperty(key); } public String getProperty(String key, String defaultValue){ return propertyFile.getProperty(key, defaultValue); }
}
</source>
Facade pattern in Java
<source lang="java">
/* The Design Patterns Java Companion Copyright (C) 1998, by James W. Cooper IBM Thomas J. Watson Research Center
- /
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.ruponent; import java.awt.Dialog; import java.awt.Frame; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Label; import java.awt.List; import java.awt.Panel; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.Vector; public class DatabaseFrame extends Frame implements ActionListener,
ItemListener { Database db; List Tables, Columns, Data; TextArea query; Button Search, Quit; public DatabaseFrame() { super("Database demonstration"); setGUI(); db = new Database("sun.jdbc.odbc.JdbcOdbcDriver"); db.Open("jdbc:odbc:Grocery prices", null); String tnames[] = db.getTableNames(); loadList(Tables, tnames); String queryText = "SELECT * from yourTableName"; query.setText(queryText); } //------------------------------------ private void setGUI() { setBackground(Color.lightGray); setLayout(new BorderLayout()); Panel pn = new Panel(); add("North", pn); pn.setLayout(new GridLayout(1, 3)); pn.add(new Label("Tables")); pn.add(new Label("Columns")); pn.add(new Label("Data")); Panel pc = new Panel(); add("Center", pc); pc.setLayout(new GridLayout(1, 3)); pc.add(Tables = new List(15)); pc.add(Columns = new List(15)); pc.add(Data = new List(15)); Tables.addItemListener(this); Columns.addItemListener(this); Panel ps = new Panel(); add("South", ps); ps.add(query = new TextArea("", 3, 40)); addPanel(ps, Search = new Button("Run Query")); addPanel(ps, Quit = new Button("Quit")); Search.addActionListener(this); Quit.addActionListener(this); setBounds(100, 100, 500, 300); setVisible(true); } //------------------------------------ private void addPanel(Panel ps, Component c) { Panel p = new Panel(); ps.add(p); p.add(c); } //------------------------------------ private void loadList(List list, String[] s) { list.removeAll(); for (int i = 0; i < s.length; i++) list.add(s[i]); } //------------------------------------ public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == Quit) System.exit(0); if (obj == Search) clickedSearch(); } //------------------------------------ public void itemStateChanged(ItemEvent e) { Object obj = e.getSource(); if (obj == Tables) showColumns(); if (obj == Columns) showData(); } //------------------------------------ private void showColumns() { String cnames[] = db.getColumnNames(Tables.getSelectedItem()); loadList(Columns, cnames); } //------------------------------------ private void showData() { String colname = Columns.getSelectedItem(); String colval = db.getColumnValue(Tables.getSelectedItem(), colname); Data.setVisible(false); Data.removeAll(); Data.setVisible(true); colval = db.getNextValue(Columns.getSelectedItem()); while (colval.length() > 0) { Data.add(colval); colval = db.getNextValue(Columns.getSelectedItem()); } } //------------------------------------ private void clickedSearch() { resultSet rs = db.Execute(query.getText()); String cnames[] = rs.getMetaData(); Columns.removeAll(); queryDialog q = new queryDialog(this, rs); q.show(); } //------------------------------------ static public void main(String argv[]) { new DatabaseFrame(); }
} class queryDialog extends Dialog implements ActionListener {
resultSet results; Button OK; textPanel pc; Vector tables; public queryDialog(Frame f, resultSet r) { super(f, "Query Result"); results = r; setLayout(new BorderLayout()); OK = new Button("OK"); Panel p = new Panel(); add("South", p); p.add(OK); OK.addActionListener(this); pc = new textPanel(); pc.setBackground(Color.white); add("Center", pc); makeTables(); setBounds(100, 100, 500, 300); setVisible(true); repaint(); } //------------------------------------- private void makeTables() { tables = new Vector(); String t[] = results.getMetaData(); tables.addElement(t); while (results.hasMoreElements()) { tables.addElement(results.nextElement()); } } //------------------------------------- public void actionPerformed(ActionEvent e) { setVisible(false); } //------------------------------------- class textPanel extends Panel { public void paint(Graphics g) { String s[]; int x = 0; int y = g.getFontMetrics().getHeight(); int deltaX = (int) 1.5f * (g.getFontMetrics().stringWidth("wwwwwwwwwwwwww")); for (int i = 0; i < tables.size(); i++) { s = (String[]) tables.elementAt(i); for (int j = 0; j < s.length; j++) { String st = s[j]; g.drawString(st, x, y); x += deltaX; } x = 0; y += g.getFontMetrics().getHeight(); if (i == 0) y += g.getFontMetrics().getHeight(); } } }
} class Database {
Connection con; resultSet results; ResultSetMetaData rsmd; DatabaseMetaData dma; String catalog; String types[]; String database_url; public Database(String driver) { types = new String[1]; types[0] = "TABLES"; //initialize type array try { Class.forName(driver); } //load the Bridge driver catch (Exception e) { System.out.println(e.getMessage()); } } //----------------------------------- public void close() { try { con.close(); } catch (Exception e) { System.out.println("close error"); } } //----------------------------------- public void Open(String url, String cat) { catalog = cat; database_url = url; try { con = DriverManager.getConnection(url); dma = con.getMetaData(); //get the meta data } catch (Exception e) { System.out.println(e.getMessage()); } } //----------------------------------- public void reOpen() { try { con = DriverManager.getConnection(database_url); dma = con.getMetaData(); //get the meta data } catch (Exception e) { System.out.println(e.getMessage()); } } //----------------------------------- public String[] getTableNames() { String[] tbnames = null; Vector tname = new Vector(); //add the table names to a Vector //since we don"t know how many there are try { results = new resultSet(dma.getTables(catalog, null, "%", types)); } catch (Exception e) { System.out.println(e); } while (results.hasMoreElements()) tname.addElement(results.getColumnValue("TABLE_NAME")); //copy the table names into a String array tbnames = new String[tname.size()]; for (int i = 0; i < tname.size(); i++) tbnames[i] = (String) tname.elementAt(i); return tbnames; } //----------------------------------- public String[] getTableMetaData() { // return the table type information results = null; try { results = new resultSet(dma.getTables(catalog, null, "%", types)); } catch (Exception e) { System.out.println(e.getMessage()); } return results.getMetaData(); } //----------------------------------- public String[] getColumnMetaData(String tablename) { //return the data on a column results = null; try { results = new resultSet(dma.getColumns(catalog, null, tablename, null)); } catch (Exception e) { System.out.println(e.getMessage()); } return results.getMetaData(); } //----------------------------------- public String[] getColumnNames(String table) { //return an array of Column names String[] tbnames = null; Vector tname = new Vector(); try { results = new resultSet(dma.getColumns(catalog, null, table, null)); while (results.hasMoreElements()) tname.addElement(results.getColumnValue("COLUMN_NAME")); } catch (Exception e) { System.out.println(e); } tbnames = new String[tname.size()]; for (int i = 0; i < tname.size(); i++) tbnames[i] = (String) tname.elementAt(i); return tbnames; } //----------------------------------- public String getColumnValue(String table, String columnName) { //return the value of a given column String res = null; try { if (table.length() > 0) results = Execute("Select " + columnName + " from " + table + " order by " + columnName); if (results.hasMoreElements()) res = results.getColumnValue(columnName); } catch (Exception e) { System.out.println("Column value error" + columnName + e.getMessage()); } return res; } //----------------------------------- public String getNextValue(String columnName) { // return the next value in that column //using the remembered resultSet String res = ""; try { if (results.hasMoreElements()) res = results.getColumnValue(columnName); } catch (Exception e) { System.out .println("next value error" + columnName + e.getMessage()); } return res; } //----------------------------------- public resultSet Execute(String sql) { //execute an SQL query on this database results = null; try { Statement stmt = con.createStatement(); results = new resultSet(stmt.executeQuery(sql)); } catch (Exception e) { System.out.println("execute error: " + e.getMessage()); } return results; }
} class resultSet {
//this class is a higher level abstraction //of the JDBC ResultSet object ResultSet rs; ResultSetMetaData rsmd; int numCols; public resultSet(ResultSet rset) { rs = rset; try { //get the meta data and column count at once rsmd = rs.getMetaData(); numCols = rsmd.getColumnCount(); } catch (Exception e) { System.out.println("resultset error" + e.getMessage()); } } //----------------------------------- public String[] getMetaData() { //returns an array of all the column names //or other meta data String md[] = new String[numCols]; try { for (int i = 1; i <= numCols; i++) md[i - 1] = rsmd.getColumnName(i); } catch (Exception e) { System.out.println("meta data error" + e.getMessage()); } return md; } //----------------------------------- public boolean hasMoreElements() { try { return rs.next(); } catch (Exception e) { System.out.println("next error " + e.getMessage()); return false; } } //----------------------------------- public String[] nextElement() { //copies contents of row into string array String[] row = new String[numCols]; try { for (int i = 1; i <= numCols; i++) row[i - 1] = rs.getString(i); } catch (Exception e) { System.out.println("next element error" + e.getMessage()); } return row; } //------------------------------------- public String getColumnValue(String columnName) { String res = ""; try { res = rs.getString(columnName); } catch (Exception e) { System.out.println("Column value error:" + columnName + e.getMessage()); } return res; } //------------------------------------- public String getColumnValue(int i) { String res = ""; try { res = rs.getString(i); } catch (Exception e) { System.out.println("Column value error: " + i + " " + e.getMessage()); } return res; } //---------------------------------------------- public void finalize() { try { rs.close(); } catch (Exception e) { System.out.println(e.getMessage()); } }
}
</source>