首页 > 解决方案 > 如何实现策略设计模式

问题描述

谁能告诉我们如何在下面的代码中实现策略设计模式。我已经浏览了各种链接,但对实施它并不完全清楚。问题是:使用策略设计模式计算点数并以 PDF 或 HTML 格式显示报告。下面是已经可用的代码。Customer、Movie 和 Rental 是已经创建的类:

  1. 客户.java

     public class Customer {
     private String _name;
     private Vector _rentals = new Vector();
     public Customer(String name) {
     _name = name;
     };
    
     public void addRental(Rental arg) {
     _rentals.addElement(arg);
     }
    
     public String getName() {
     return _name;
     }
    
    public static void main(String[] args) {
    
     Customer c = new Customer("ABC");
     Movie m = new Movie("Title", 1);
     Rental r = new Rental(m, 10);
     c.addRental(r);
     // Rental calculation
     String s = c.statement();
     System.out.println("s: " + s);
    }
         public String statement() {
         double totalAmount = 0;
     int frequentRenterPoints = 0;
     Enumeration rentals = _rentals.elements();
     String result = "Rental Record for " + getName() + "\n";
    
     while (rentals.hasMoreElements()) {
         double thisAmount = 0;
         Rental each = (Rental) rentals.nextElement();
    
         // determine amounts for each line
         switch (each.getMovie().getPriceCode()) {
    
         case Movie.REGULAR:
             thisAmount += 2;
             if (each.getDaysRented() > 2)
                 thisAmount += (each.getDaysRented() - 2) * 1.5;
             break;
    
         case Movie.NEW_RELEASE:
             thisAmount += each.getDaysRented() * 3;
             break;
    
         case Movie.CHILDRENS:
             thisAmount += 1.5;
             if (each.getDaysRented() > 3)
                 thisAmount += (each.getDaysRented() - 3) * 1.5;
             break;
         } // add frequent
             // renter points
         frequentRenterPoints++;
    
         // add bonus for a two day new release rental
         if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && each.getDaysRented() > 1)
             frequentRenterPoints++;
    
         // show figures for this rental
         result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(thisAmount) + "\n";
         totalAmount += thisAmount;
     }
    
     // add footer lines
     result += "Amount owed is " + String.valueOf(totalAmount) + "\n";
     result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";
     return result;
     }
     }
    
  2. 电影.java

    public class Movie {
    public static final int CHILDRENS = 2;
    public static final int REGULAR = 0;
    public static final int NEW_RELEASE = 1;
    private String _title;
    private int _priceCode;
    
     public Movie(String title, int priceCode) {
    _title = title;
    _priceCode = priceCode;
    }
    public int getPriceCode() {
        return _priceCode;
    }
    
    public void setPriceCode(int arg) {
    _priceCode = arg;
    }
    public String getTitle() {
    return _title;
    };
    }
    
  3. 出租.java

    public class Rental {
        private Movie _movie;
    private int _daysRented;
    public Rental(Movie movie, int daysRented) {
        _movie = movie;
    _daysRented = daysRented;
    }
    public int getDaysRented() {
        return _daysRented;
    }
        public Movie getMovie() {
        return _movie;
    }
    }
    

标签: javadesign-patterns

解决方案


您的任务是“使用策略设计模式以 PDF 或 HTML 格式显示报告”,因此将在此处应用策略。在显示报告之前,您应该拥有所有计算数据(保持工作已完成),然后只需传递数据并选择适当的报告类型。

public interface IReport 
{
    public void printReport(String data);
}

public class ReportHTML implements IReport
{
    @Override
    public void printReport(String data) {
        System.out.println("Html Report with data="+data);  
    }
}

public class ReportPDF implements IReport{
    @Override
    public void printReport(String data) {
        System.out.println("PDF Report with data="+data);   
    }
}

public class Test {
    public static void main(String[] args)
    {
        //do whatever computation concerning business logic
        //after for print pass computed data and chose report type as needed
        IReport ir = new ReportHTML();
        ir.printReport("[Customers, Movie, Rental]");
        ir = new ReportPDF();
        ir.printReport("[Customers, Movie, Rental]");
    }
}

输出:

Html Report with data=[Customers, Movie, Rental]
PDF Report with data=[Customers, Movie, Rental]

推荐阅读