Это осуществление главного файла правильно strategy в java? [закрывшая]

Читая статью о Microsoft, я стараюсь помогать главный файл strategy в собственном проекте, идея - следующая: У меня есть JTextArea и кнопка печатения и один JComboBox что позволяет выбирать формат печати pdf/txt/csv, код функционирует (хотя остается осуществлять код, который на самом деле производит правильные форматы, но я это сделаю после.), но я не знаю, ли осуществлен я действительно главный файл strategy или только делаю дешевую копию его. Здесь код.

public interface Impresora {

public void print(); }

и следующие классы, которые они осуществляют interface

public class ImprimePDF implements Impresora{

private String documento;

public ImprimePDF(String doc){
    documento = doc;
}

public void print(){
    System.out.println("¡esto es un pdf wow!");
    System.out.println(documento);
}}

и для csv

public class ImprimeCSV implements Impresora{

private String documento;

public ImprimeCSV(String doc){
    documento = doc;
}

public void print(){
    System.out.println("¡Esto es un csv, wow!");
    System.out.println(documento);
}}

Код для txt сходный. Мой вид - следующий:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Vista{

private JTextArea area;
private JFrame ventana;
private JButton imprimir;
private JLabel label;
private JComboBox box;

public Vista(){

    ventana = new JFrame();
    ventana.setTitle("Line of fire");
    ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ventana.setLayout(new BorderLayout());

    area = new JTextArea(10,35);                
    JPanel panelcontrol = new JPanel();
    label    = new JLabel("Seleccione el formato:");
    box      = new JComboBox(new String[]{"txt", "pdf", "csv"});
    imprimir = new JButton(new ImageIcon("printer.png"));
    imprimir.addActionListener(new Printer(this));

    panelcontrol.add(label);
    panelcontrol.add(box);
    panelcontrol.add(imprimir);

    ventana.add(new JScrollPane(area), BorderLayout.CENTER);
    ventana.add(panelcontrol, BorderLayout.SOUTH);
    ventana.pack();
    ventana.setVisible(true);
}

public JTextArea getTextArea(){
    return area;
}

public JComboBox getComboBox(){
    return box;
}}

И в конце концов мой класс контекст (который также функционирует как класс Listener), что, как я понимаю, это та, которая решает, какое особенное осуществление алгоритма instanciar:

import java.awt.event.*;
import javax.swing.JComboBox;
import javax.swing.JTextArea;

public class Printer implements ActionListener{

//Para obtener el tipo de impresión correcta
private JComboBox combobox;
private JTextArea area;    
private Impresora default_printer;

public Printer(Vista vayjay){

    combobox = vayjay.getComboBox();
    area     = vayjay.getTextArea();            
}

public void actionPerformed(ActionEvent e){
    String tipoimpresion = combobox.getSelectedItem().toString();
    String document = area.getText();
    switch(tipoimpresion){
        case "txt" : 
            default_printer = new ImprimeTXT(document);                
            break;
        case "pdf" :
            default_printer = new ImprimePDF(document);                
            break;
        case "csv" :
            default_printer = new ImprimeCSV(document);                
            break;
    }
    System.out.println("su trabajo se está procesando...");
    default_printer.print();
    System.out.println("Trabajo terminado.");
}}

Если они смогут показывать мне, что я врежу, я ему буду благодарен за них много, дело в том, что он женил их переключателя, они мне кажутся супер подозреваемыми, как я прочитал, этот главный файл strategy - это точно, чтобы не иметь switch-case.

2
задан 20.01.2017, 21:40
0 ответов

Ты не имеешь совсем не плохой в коде, главный файл strategy хорошо осуществлен, разум переключателя вступил в брак он, потому что listener, - управляющий в том, чтобы создавать принтеры, а именно, что listener превращается в факторию конкретных объектов, которые осуществляют стратегию, Природа фактории состоит в разветвлении и заставлении объект X создавать, так что нормально видеть переключатель, вступите в брак

У Printer.java есть два типа ответственности, обе ответственность - в actionPermorfed

если мы предполагаем метод так называемый actualizarImpresora, который брался бы за то, чтобы меняться, выбирать принтер, который нужно использовать (стоимость default_printer) и обновлять документ тогда, код сокращается в:

public void actionPerformed(ActionEvent e){
    System.out.println("su trabajo se está procesando...");
    actualizarImpresora(); 
    default_printer.print();    
    System.out.println("Trabajo terminado.");
}}

Это частичное решение, так как actionPerformed ничто не было бы должно обновлять, это было бы должно делать это самим comboBox через ItemListener

Лучшее Решение:

Прежде всего, нужно изменять интерфейс Принтер, для того, чтобы он позволил менять документ на движение, после всего, принтер печатает несколько документов, если бы они были доступными, мы были бы должны покупать принтер за документ (он представляет оплачивать это...)

public interface Impresora {
    public void print(); 
    public void setDocument(Object document); // permite cambiar el documento "on the fly"
}

Потом в класс Printer, создаются назначенные по умолчанию принтеры, которые совпадали бы с индексом combobox.

Файл Printer.java

import java.awt.event.*;
import javax.swing.JComboBox;
import javax.swing.JTextArea;

public class Printer implements ActionListener{

//Para obtener el tipo de impresión correcta
private JComboBox combobox;
private JTextArea area;    
private Impresora default_printer;
private Impresora[] impresoras;

public Printer(Vista vayjay){

    impresoras = new Impresora[]{
        new ImprimeTXT(),
        new ImprimePDF(),
        new ImprimeCSV()
    };
    combobox = vayjay.getComboBox();
    combobox.addItemListener(new ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e){
            default_printer = impresoras[combobox.getSelectedIndex()];        
        }
    })
    area     = vayjay.getTextArea();
    default_printer = impresoras[0];
}

public void actionPerformed(ActionEvent e){
    System.out.println("su trabajo se está procesando...");
    default_printer.setDocument(area.getText())       
    default_printer.print();
    System.out.println("Trabajo terminado.");
}}

То, что делает сейчас файл Printer.java, состоит в том, что добавляет ItemListener comboBox, каков - управляющий в том, чтобы менять принтер, который нужно использовать, когда пользователь выберет выбор.

Сейчас actionPerformed только обнови документ в принтере, и напечатай, он не нуждается в том, чтобы не сделать больше ничего.

4
ответ дан 03.12.2019, 17:36