Какой шаблон дизайна подойдет для этой программы? - PullRequest
0 голосов
/ 27 ноября 2018

Предположим, мне нужно создать приложение с графическим интерфейсом на Java.Макет выглядит следующим образом: enter image description here

Обе панели являются JPanel объектами.Левый содержит объект из класса ProductList.java, который расширяет awt.List.Правый содержит объект из класса ProductTable.java, который расширяет JScrollPane и добавляет реализацию TableModel к своему JViewPort объекту.ProductList и ProductTable добавляются к панелям следующим образом:

pleft.add(new ProductList()); 

и

pright.add(new ProductTable());  

Теперь это должно измениться.Класс Lister.java должен заменить эти классы следующим образом:

pleft.add(new Lister(Lister.LIST));

и

pright.add(new Lister(Lister.TABLE));

Я недавно начал видеть шаблоны проектирования в Java, поэтому мое понимание и опыт их использования довольноограничено.Я мог бы подумать о шаблоне проектирования фабрики или декоратора, поскольку класс Lister предоставляет два объекта, которые в некоторой степени связаны (оба они являются awt.Component объектами).Что меня смущает, так это то, как new Lister() может доставить два разных объекта, используя только параметр конструктора String.Я застрял здесь:

public class Lister{

    public static final String LIST = "LIST";
    public static final String TABLE = "TABLE";

    public Lister(String type){
        if(type.equals(LIST)) {

        }
        if(type.equals(TABLE)) {

        }
    }
}

Основная программа выглядит следующим образом: ProductDisplay.java

public class ProductDisplay extends JFrame
{
    private static final long serialVersionUID = 1L;

    public ProductDisplay()
    {
        super("Die Telematik-Produkte");
        setLF();             //set look and feel
        setCloseClick();     //set close on window close click
        InputFile f = new InputFile("products.txt");
        Vector<String> prod = new Vector<String>();
        //read in product list
        String s = f.readLine();

        while(s != null)
        {
            prod.addElement(s);
            s = f.readLine();
        }
        JPanel p = new JPanel();
        getContentPane().add(p);
        p.setLayout(new GridLayout(1,2));

        JPanel pleft = new JPanel();
        JPanel pright = new JPanel();
        p.add(pleft);
        p.add(pright);
        pleft.setLayout(new BorderLayout());
        pright.setLayout(new BorderLayout());

        //add in customer view as list box
        pleft.add("North", new JLabel("Customer view"));

        pleft.add("Center", new ProductList(prod));           // This row ...
        //pleft.add("Center", new Lister(prod, Lister.LIST)); // ...should be replaced by this one

        //add in execute view as table
        pright.add("North", new JLabel("Executive view"));

        pright.add("Center", new ProductTable(prod));           // And this row ...
        //pright.add("Center", new Lister(prod, Lister.TABLE)); // ...should be replaced by this one


        setSize(new Dimension(400,300));
        setVisible(true);
    }
    //-----------------------------------------  
    private void setCloseClick()
    {
        //create window listener to respond to window close click
        addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        });
    }
    //------------------------------------------
    private void setLF()
    {
        // Force SwingApp to come up in the System L&F
        String laf = UIManager.getSystemLookAndFeelClassName();
        try {
            UIManager.setLookAndFeel(laf);
        }
        catch (UnsupportedLookAndFeelException exc) 
        {System.err.println("Warning: UnsupportedLookAndFeel: " + laf);}
        catch (Exception exc) {System.err.println("Error loading " + laf + ": " + exc);
        }
    }

    //---------------------------------------------

    static public void main(String argv[])
    {
        new ProductDisplay();
    }
}

ProductList.java

public class ProductList extends java.awt.List
{
    private static final long serialVersionUID = 1L;

    public ProductList(Vector<String> products)
    {
        super(products.size());    //for compatibility
        for (int i = 0; i < products.size(); i++)
        {
            //take each strig apart and keep only
            //the product names, discarding the quntities
            String s = products.elementAt(i);
            int index = s.indexOf("--");  //separate qty from name
            if(index > 0)
                add(s.substring(0, index));
            else
                add(s);
        }
    }
}

ProductTable.java

public class ProductTable extends JScrollPane
{
    private static final long serialVersionUID = 1L;

    JTable table;

    public ProductTable(Vector<String> list)
    {
        table = new JTable(new prodModel(list));
        getViewport().add(table);
    }
}
class prodModel implements TableModel
{

    int rows;

    int columns;

    Vector<String> prodNames;

    Vector<String> quantities;

    public prodModel(Vector<String> products)
    {
        rows  = products.size();
        columns = 2;
        prodNames = new Vector<String>();
        quantities =  new Vector<String>();
        for(int i=0; i< products.size(); i++)
        {
            String s = products.elementAt(i);
            int index = s.indexOf("--");  //separate qty from name
            if(index > 0)
            {
                prodNames.addElement(s.substring(0, index));
                quantities.addElement(s.substring(index+2).trim());
            }
            else
                prodNames.addElement(s);

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...