import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; interface Oracle { String ask(Oracle asker, String query) throws Exception; } interface Actor extends Oracle { } interface UseCaseController extends Oracle { String execute(Oracle caller, String cmmd) throws Exception; } class GetDiscount implements UseCaseController { private Actor dbase; private double amt; public void setDbase(Actor a) { dbase = a; } public String ask(Oracle asker, String query) throws Exception { if (query.equals("amount?")) { return "" + amt; } else { return null; } } public String execute(Oracle a, String cmmd) throws Exception { String response = a.ask(this, "amount?"); amt = new Double(response); if (amt < 0) { throw new Exception(); } response = dbase.ask(this, "rate?"); double rate = new Double(response); return "" + rate * amt; } } // adapters: class MockUI implements Actor { private UseCaseController port; public void setPort(UseCaseController c) { port = c; } public void initiate() throws Exception { for(int i = 0; i < 10; i++) { String result = port.execute(this, null); System.out.println(result); } } public String ask(Oracle asker, String query) throws Exception { if (query.equals("amount?")) { return "$" + 1000 * Math.random(); } else { return null; } } } class CUI implements Actor { private UseCaseController port; private Scanner kbd = new Scanner(System.in); public void setPort(UseCaseController c) { port = c; } public void initiate() throws Exception { while(true) { System.out.print("-> "); String cmmd = kbd.next(); if (cmmd.equals("quit")) break; String result = port.execute(this, cmmd); System.out.println(result); } System.out.println("bye"); } public String ask(Oracle asker, String query) throws Exception { System.out.print(query); return kbd.next(); } } class GUI extends JPanel implements Actor, ActionListener { private UseCaseController port; private JButton discountButton = new JButton("get discount"); private JLabel resultLabel = new JLabel(" 0 "); public void setPort(UseCaseController c) { port = c; } public GUI() { add(discountButton); discountButton.addActionListener(this); add(new JLabel("discount = $")); add(resultLabel); } public void actionPerformed(ActionEvent ae) { try { String result = port.execute(this, ""); resultLabel.setText(result); repaint(); } catch(Exception e) { JOptionPane.showMessageDialog(this, "invalid amount"); } } public void initiate() throws Exception { JFrame frame = new JFrame(); frame.setTitle("Discount Calculator"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(this); frame.pack(); frame.setVisible(true); } public String ask(Oracle asker, String query) throws Exception { return JOptionPane.showInputDialog("amount?"); } } class MockDbase implements Actor { public String ask(Oracle asker, String query) throws Exception { if (query.equals("rate?")) { String amt = asker.ask(this, "amount?"); double a = new Double(amt); if (a > 500) { return "" + .08; } else { return "" + .04; } } else { return null; } } } public class TestGetDiscount { public static void main(String[] args) { try { GetDiscount c = new GetDiscount(); c.setDbase(new MockDbase()); //MockUI ui = new MockUser(); //CUI ui = new CUI(); GUI ui = new GUI(); ui.setPort(c); ui.initiate(); } catch(Exception e) { System.out.println(e); } } }