1.电影类
package com.xu.cinema;
public class Movie {
private String name;//电影名
private String direction;//导演
private String actor;//主演
private int price;//价格
private String time;//放映时间
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDirection() {
return direction;
}
public void setDirection(String direction) {
this.direction = direction;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public Movie() {
}
public Movie(String name, String direction, String actor, int price, String time) {
this.name = name;
this.direction = direction;
this.actor = actor;
this.price = price;
this.time = time;
}
@Override
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", direction='" + direction + '\'' +
", actor='" + actor + '\'' +
", price=" + price +
", time='" + time + '\'' +
'}';
}
}
2.普通票类
package com.xu.cinema;
/**
* 普通票类(学生票与赠票的父类)
* */
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class Ticket implements IPrint{
private Movie movie;//电影
private String seatnum;//座位号
private String createNum(){
Random rand=new Random();
int m=rand.nextInt(20)+1;//排
int n= rand.nextInt(30)+1;//号
return m+"排"+n+"号";
}
protected int calc(){
//计算票价的方法:需要子类进行重写
//普通票价格就是电影的价格
return this.movie.getPrice();
}
public Movie getMovie() {
return movie;
}
public void setMovie(Movie movie) {
this.movie = movie;
}
public String getSeatnum() {
return seatnum;
}
public void setSeatnum(String seatnum) {
this.seatnum = seatnum;
}
public Ticket() {
this.seatnum =this.createNum();
}
public Ticket(Movie movie) {
this();//调用本类的默认构造,必须第一行
this.movie = movie;
}
@Override
public String toString() {
return "Ticket{" +
"movie=" + movie +
", seatnum='" + seatnum + '\'' +
'}';
}
public static void main(String[] args) {
Ticket ticket=new Ticket();
System.out.println(ticket);
}
//重写接口方法
@Override
public void print() {
//打印用户购票样式
SimpleDateFormat sdf=new SimpleDateFormat();
System.out.println("===============夜不归宿电影院===============");
System.out.println("电影名称:【"+this.movie.getName()+"】\t座位:"+this.seatnum+"\n");
System.out.println("票价:¥"+this.calc()+"元\t放映时间:"+this.movie.getTime());
System.out.println("=======购票时间【"+sdf.format(new Date())+"】=======");
}
}
3.学生票类
package com.xu.cinema;
public class StudentTicket extends Ticket{
//特有属性(折扣)
private int discont;
public int getDiscont() {
return discont;
}
public void setDiscont(int discont) {
this.discont = discont;
}
public StudentTicket() {
}
public StudentTicket(Movie movie) {
super(movie);
}
@Override
public String toString() {
return super.toString();
}
@Override
protected int calc() {
return this.getMovie().getPrice()/10*this.discont;
}
}
4.赠票类
package com.xu.cinema;
public class FreeTicket extends Ticket{
//特有的客户姓名
private String cname;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public FreeTicket() {
}
public FreeTicket(Movie movie) {
super(movie);
}
@Override
protected int calc() {
return 0;
}
}
5.电影院类
package com.xu.cinema;
public class Cinema {
//定义一个电影数组:来存放当前电影院要放映的所有电影
private static Movie[] movies=new Movie[4];
//静态代码块
static {
//为了提高速度,且只执行一次
//存放若干个电影
//创建电影
Movie m1=new Movie("变形金刚","迈克尔","张三",100,"20:00");
Movie m2=new Movie("变形金刚2","迈克尔","张三",36,"19:00");
Movie m3=new Movie("变形金刚3","迈克尔","张三",40,"20:30");
Movie m4=new Movie("变形金刚4","迈克尔","张三",80,"15:00");
//存入到数组中
movies[0]=m1;
movies[1]=m2;
movies[2]=m3;
movies[3]=m4;
}
//浏览所有电影信息
public void showMovies(){
if (movies.length>0){
for (Movie movie:movies){
System.out.println(movie);
}
}
}
/*
* 根据电影名称获取电影对象
* */
public Movie findByName(String cname){
Movie m=null;
//遍历数组
for (Movie movie:movies){
//根据名称进行查询
if (cname.equals(movie.getName())){
m= movie;
break;
}
}
return m;
}
}
6.电影票工厂
package com.xu.cinema;
public class TicketFactory {
public static Ticket choose(int m,Movie movie){
Ticket ticket=null;
switch (m){
case 1:ticket=new Ticket(movie);break;
case 2:ticket=new StudentTicket(movie);break;
case 3:ticket=new FreeTicket(movie);break;
}
return ticket;
}
}
7.创建购票打印接口
package com.xu.cinema;
/**
* 打印接口
* */
public interface IPrint {
void print();
}
8.实现打印效果
package com.xu.cinema;
/**
* 电影院项目测试类
* */
import java.util.Scanner;
public class View {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=0;
//创建Cinema的对象
Cinema cinema=new Cinema();
do {
System.out.println("夜不归宿电影院欢迎您!");
System.out.println("1:浏览电影 2:购票 3:退出");
m=in.nextInt();
switch(m){
case 1://浏览电影
cinema.showMovies();
break;
case 2://购票
System.out.println("请输入电影名称:");
String name=in.next();
//接收获取的电影对象
Movie movie=cinema.findByName(name);
//输出电影对象
if (movie!=null) {
System.out.println(movie);
System.out.println("请选择票的类型:1.普通 2.学生 3.增票");
int n=in.nextInt();
//调用工厂类
Ticket ticket= TicketFactory.choose(n, movie);
//普通
//学生
if (ticket instanceof StudentTicket){
System.out.println("请输入折扣:");
int zk=in.nextInt();
((StudentTicket) ticket).setDiscont(zk);
}
//赠票
if (ticket instanceof FreeTicket){
//设置客户姓名
System.out.println("请输入客户姓名:");
String cname=in.next();
((FreeTicket) ticket).setCname(cname);
}
//计算价格
int calc = ticket.calc();
//输出用户购票信息
ticket.print();
System.out.println("票价是"+calc+"元");
}else{
System.out.println("对不起,电影不存在!");
}
break;
case 3://退出
System.out.println("谢谢光临,下次再见!");
System.exit(0);//参数0表示正常退出
break;
}
}while(m!=0);
}
}