Java/Design Pattern/Facade Pattern

Материал из Java эксперт
Перейти к: навигация, поиск

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>