java - 如何实现策略设计模式
问题描述
谁能告诉我们如何在下面的代码中实现策略设计模式。我已经浏览了各种链接,但对实施它并不完全清楚。问题是:使用策略设计模式计算点数并以 PDF 或 HTML 格式显示报告。下面是已经可用的代码。Customer、Movie 和 Rental 是已经创建的类:
客户.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; } }
电影.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; }; }
出租.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; } }
解决方案
您的任务是“使用策略设计模式以 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]
推荐阅读
- java - 为什么我的 config.yml 文件一直只输出零?bukkit 插件
- reactjs - 如果它没有在构造函数中绑定 this,为什么它在反应组件方法中解析为 undefined 而不是 window/global-env
- python-3.x - 如何优化此函数中包含的以下代码
- flutter - 当我们在 Flutter 的 TextField 小部件中输入时如何格式化文本?
- r - R嵌套在多个列表中的重复列表子集
- html - 使段落和表格内联并放置在容器中间
- swift - 矩阵供电时,有调试错误代码 = EXC_I386_INVOP
- javascript - 如何使用 JS fetch 重写 Angular ng-file-upload Upload.upload?
- c# - 杀死异步任务c#,wpf
- firebase - 生成带有可预测 URL 的缩略图