公园门票
题目描述:
某公园门票有两种, 一种为纸质票, 一种为电子票. 门票的价格根据不同的人群有不同的折扣, 其中军人免费, 儿童减 30, 学生打 8 折, 其他原价. 先请你写一段出票的程序.
设计要求:
- 定义两个抽象策略接口, 一个为折扣 (
Discount
), 一个为票的类型 (Ticket
)
- 不同折扣均定义成实现
Discount
接口的类, 不同类型的票均定义成实现 Ticket
接口的类. (各种具体的策略类)
- 定义一个公园门票类 (环境类), 该类至少包含两个实例变量, 一个是
Discount
的引用, 一个是 Ticket
的引用.
该类可以根据 Discount
引用所指向折扣类型的不同计算出折扣后的票价, 可以根据 Ticket
引用所指向的票的类型不同返回不同类型的票.
- 定义一个
Main
类 (客户端类). 该类用上述类实现题目要求.
这种设计方式叫 策略模式, 该模式的一个很重要的优点是:
当有新的折扣类型 (比如老年人票) 或新的票的类型 (比如凭身份证入场) 时, 只需要添加相应的类, 去实现对应的策略, 然后修改Main类就可以了. 其他的代码均不用修改.
如果使用配置文件, 连Main类都不需要修改.
所以检验自己的设计是否符合要求的方法就是真的去增加老年票或凭身份证入场, 看是不是真的只需修改Main类, 而不需要修改原有的其他任何类的代码。
输入:
第一行为一个整数, 代表原始票价, 第二行也是一个整数 n(0<n<50), 代表测试用例组数. 后边是 n 行, 每行一组测试用例.
格式为用空格分隔的两个字符串, 前边的为客户类型 (只可能是 student
, children
, soldier
, adult
之一, 依次代表学生, 儿童, 军人和其他), 后边的为票的类型 (只可能是 paper
和 electronical
之一, 依次代笔纸质票和电子票)
测试用例保证合法, 且原始票价为 10 的倍数, 所以计算打折时用整数除法即可.
输出:
共 2n 行, 其中每两行依次对应输入的测试用例, 格式为第一行输出票的类型,电子票输出 E_ticket
, 纸质票输出 PaperTicket
. 第二行输出折扣后的票价, 格式见样例.
输入样例:
1 2 3 4 5
| 100 3 adult paper children electronical student electronical
|
输出样例:
1 2 3 4 5 6
| PaperTicket Price:100 E_ticket Price:70 E_ticket Price:80
|
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
import java.util.Scanner;
public class Main { public static void main(String[] args) { var input = new Scanner(System.in); int price = input.nextInt(), n = input.nextInt();
for (int i = 0; i < n; i++) { String a = input.next(), b = input.next(); var parkTick = new ParkTick(a, b); System.out.println(parkTick.getTicket() + "\nPrice:" + parkTick.getPrice(price)); } } }
class ParkTick { private Discount discount; private Ticket ticket;
ParkTick(String a, String b) { switch (a) { case "adult" -> discount = new adult(); case "children" -> discount = new children(); case "soldier" -> discount = new soldier(); case "student" -> discount = new student(); } switch (b) { case "paper" -> ticket = new Paper(); case "electronical" -> ticket = new Electronical(); } }
int getPrice(int price) { return discount.price(price); }
String getTicket() { return ticket.ticket(); } }
interface Discount { int price(int price);
}
class student implements Discount { public int price(int price) { return (int) (price * 0.8); } }
class children implements Discount { public int price(int price) { return price - 30; } }
class soldier implements Discount { public int price(int price) { return 0; } }
class adult implements Discount { public int price(int price) { return price; } }
interface Ticket { String ticket(); }
class Paper implements Ticket { public String ticket() { return "PaperTicket"; } }
class Electronical implements Ticket { public String ticket() { return "E_ticket"; } }
|
2023-04-17
IP属地: 北京