0

こんにちは皆さん、私は戦略パターンを実装しようとしていますが、具体的なクラスで量を設定することはできません。つまり、量は、インターフェイスと関係があるヘルパークラスのものと同じように再生成されます。コンストラクターとsetterおよびgetterメソッドを使用して値を設定しようとしましたが、確認してフィードバックを提供できる場合は機能しません。コードは次のとおりです。

public interface InvoicingAlgorithm 
{
    public void getInvoice(String name, double amount);
}


public class AmericanInvoice implements InvoicingAlgorithm
{



    AmericanInvoice()
    {

    }
    //Uk: america 1 : 1.57
    @Override
    public void getInvoice(String name, double amount) 
    {
        Customer customer = new Customer(name , amount * 1.57);
        customer.setAmount(amount * 1.57);
        customer.getInvoice();
    }

}

public class Customer 
{

    /**
     * @param name represent the name of the Customer
     */
    private String name;

    /**
     * @param amount represent the amount of money
     */
    private double amount;

    /**
     * @param i represents object of InvoicingAlgorithm
     */
    private InvoicingAlgorithm i;

    Customer(String name, double amount)
    {
        this.name = name;
        this.amount = amount;

    }

     public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public InvoicingAlgorithm getI() {
        return i;
    }


    public void setInvoicingAlgorithm(InvoicingAlgorithm i)
    {
        this.i = i;
    }

    public String getInvoice()
    {
        DecimalFormat df = new DecimalFormat("#.00");
        String total = "--------------------------------------TO:   "
              + name + "FROM: Easyflap (UK) AMOUNT"  + ":$" + 
                df.format(amount) 
              + "--------------------------------------";

        return total;
    }
}

したがって、テストすると、値が返されます-------------------------------------- TO: OracleFROM:Easyflap(UK)金額:$ 500.00-------------------------------------- AmericanInvoiceの金額を変更しようとすると、CustomerクラスのメソッドgetInvoiceが機能しません。

AmericanInvoiceのテストクラス

public class AmericanInvoiceTest {

    /**
     * Test of getInvoice method, of class AmericanInvoice.
     */
    @Test
    public void testGetInvoice() {
        System.out.println("Producing American invoice");
        final int invoiceAmount = 500;
        final Customer c = new Customer("Oracle", invoiceAmount);
        c.setInvoicingAlgorithm(new AmericanInvoice());
        String actualOutput = c.getInvoice();
        final File f = new File("actual-american.txt");
        FileUtility.resetFile(f);
        FileUtility.writeFile(f, actualOutput);
        String expectedOutput = FileUtility.readFile(new File("expected-american.txt"));
        //System.out.println(actualOutput);
        //System.out.println(expectedOutput);
        actualOutput = actualOutput.replaceAll("\\s", "");
        expectedOutput = expectedOutput.replaceAll("\\s", "");
        //System.out.println(actualOutput);
        //System.out.println(expectedOutput);
        assertEquals(actualOutput, expectedOutput);
    }
}
4

2 に答える 2

3

ストラテジーオブジェクト自体で実際にメソッドを呼び出すことはありません。

于 2012-11-10T17:24:18.147 に答える
1

現在の為替レートでは戦略パターンを使用する必要がないため、この方法で戦略パターンを使用することは容認しません。ただし、次のコードは、例に基づいて意図したものである可能性があります。

public interface InvoicingAlgorithm {
    public double adjustInvoice(double amount);
}


public class AmericanInvoice implements InvoicingAlgorithm {    
    //Uk: america 1 : 1.57
    @Override
    public double adjustInvoice(double amount) {
        return amount * 1.57;
    }   
}

public class Customer {

    /**
     * @param name represent the name of the Customer
     */
    private String name;

    /**
     * @param amount represent the amount of money
     */
    private double amount;

    /**
     * @param i represents object of InvoicingAlgorithm
     */
    private InvoicingAlgorithm i;

    Customer(String name, double amount) {
        this.name = name;
        this.amount = amount;

    }

     public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public InvoicingAlgorithm getI() {
        return i;
    }

    public void setInvoicingAlgorithm(InvoicingAlgorithm i) {
        this.i = i;
    }

    public String getInvoice() {
        DecimalFormat df = new DecimalFormat("#.00");
        String total = "--------------------------------------TO:   "
              + name + "FROM: Easyflap (UK) AMOUNT"  + ":$" + 
                df.format(i.adjustInvoice(amount)) 
              + "--------------------------------------";

        return total;
    }
}
于 2012-11-10T17:26:59.220 に答える