1、设计模式大题5.2.某电影院售票系统为不同类型的用户提供了不同的电影票(CinemaTicket)打折方式(Discount),学生凭学生证可享受8折优惠(StudentDiscount),儿童可享受减免10元的优惠(ChildrenDiscount), VIP用户除享受半价优惠外还可以进行积分(VIPDiscount)。选择一种合适的设计模式来设计该系统。(策略模式)/电影票类:环境类class MovieTicket private double price; private Discount discount; public void setPrice(double price) thi
2、s.price = price; public void setDiscount(Discount discount) this.discount = discount; public double getPrice() return discount.calculate(this.price); /折扣类:抽象策略类interface Discount public double calculate(double price);/学生折扣类:具体策略类class StudentDiscount implements Discount public double calculate(doubl
3、e price) return price * 0.8; /儿童折扣类:具体策略类class ChildrenDiscount implements Discount public double calculate(double price) return price - 10; /VIP会员折扣类:具体策略类class VIPDiscount implements Discount public double calculate(double price) System.out.println(增加积分!); return price * 0.5; /客户端测试类class Client p
4、ublic static void main(String args) MovieTicket mt = new MovieTicket(); mt.setPrice(50.00); double currentPrice; Discount obj; obj = new StudentDiscount(); /可通过配置文件实现 mt.setDiscount(obj); currentPrice = mt.getPrice(); System.out.println(折后价为: + currentPrice); System.out.println(-); obj = new VIPDisc
5、ount(); mt.setDiscount(obj); currentPrice = mt.getPrice(); System.out.println(折后价为: + currentPrice); public interface Count public abstract void discount(double a);public class CiTicket private Count disobj; public void discount(double a) disobj.discount(a); public void setdisobj(Count disobj) this.
6、disobj=disobj; public class StTicket implements Count private double a; public void discount(double a) System.out.println(原价为+a); this.a=a*0.8; System.out.println(学生票的票价为原价的8折:+this.a); public class VTicket implements Count private double a; public void discount(double a) System.out.println(原价为+a);
7、this.a=a*0.5; System.out.println(VIP会员的票价为原价的半价:+this.a); System.out.println(VIP会员的会员卡积分一次); public class ChTicket implements Count private double a; public void discount(double a) System.out.println(原价为+a); this.a=a-10; System.out.println(儿童票的票价为原价减10元:+this.a); public class Client public static vo
8、id main(String args) CiTicket c=new CiTicket(); Count d = new StTicket(); Count d1 = new ChTicket(); Count d2 = new VTicket(); d.discount(50); d1.discount(50); d2.discount(50); c.setdisobj(d); c.setdisobj(d1); c.setdisobj(d2); 1. 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请
9、用面向对象的语言实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。import javax.swing.JOptionPane;/* * 主要显示类 * author 陈俊生 * */public class Main /* * 主方法 * param arg */ public static void main(String arg) /* * 提示输入 */ /*System.out.println(请大家输入你想让女娲造的人的代号:);*/ String str = ; /* * 当输入0时退出程序 */ while(t
10、rue) str = JOptionPane.showInputDialog(请大家输入你想让女娲造的人的代号:); NvWa nvWa = new NvWa(); Person person = nvWa.madeMan(str); person.play(); /* * 男人类 * author 陈俊生 * */class Man extends Person Override public void play() / TODO Auto-generated method stub /*System.out.println(大家好,我是男人!我来自地球!);*/ JOptionPane.s
11、howMessageDialog(null, 大家好,我是男人!我来自地球!); /* * 女娲类 * 简单工厂类 * author 陈俊生 * */class NvWa /* * 女娲造人方法 * param str 根据传递的参数进行造人 * return */ public Person madeMan(String str) Person person = null; switch (str) /* * 实例化男人 */ case M: person = new Man(); break; /* * 实例化男人 */ case W: person = new Woman(); brea
12、k; /* * 实例化机器人 */ case R: person = new Robot(); break; default:/* System.out.println(输入有误,女娲没这个能力造出你需要的人!);*/ person = new Person(); break; return person; /* * 人类 * author 陈俊生 * */class Person /* private String name;/姓名 private int age;/年龄*/ /* * 玩的方法 */ public void play() JOptionPane.showMessageDia
13、log(null, 输入有误,我还是一坨泥巴!女娲还没构造我!请重试); ;/* * 机器人类 * author 陈俊生 * */class Robot extends Person Override public void play() / TODO Auto-generated method stub /*System.out.println(大家好,我是机器人!我来自火星!);*/ JOptionPane.showMessageDialog(null, 大家好,我是机器人!我来自火星!); /* * 女人类 * author 陈俊生 * */class Woman extends Per
14、son Override public void play() / TODO Auto-generated method stub /*System.out.println(大家好,我是女人!我来自水星!);*/ JOptionPane.showMessageDialog(null, 大家好,我是女人!我来自水星!); 2.迟到的理由。(简单工厂和工厂模式)说明:根据迟到的理由不同,如:去厕所,在路上,回家等理由。当老师需要知道是何种理由迟到时只需传入相应的参数,现请使用简单工厂模式来模拟该过程。此外,如果有同学新增加一个“相亲”理由,为了遵循开闭原则,请使用工厂模式模拟上述过程。简单工厂模式
15、import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class XMLUtilReason /该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称 public static String getexcuse() try /创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder();
16、Document doc; doc = builder.parse(new File(configReason.xml); /获取包含品牌名称的文本节点 NodeList nl = doc.getElementsByTagName(excuse); Node classNode=nl.item(0).getFirstChild(); String excuse=classNode.getNodeValue().trim(); return excuse; catch(Exception e) e.printStackTrace(); return null; public abstract c
17、lass AbstractReason public abstract void reason();public class GoHome extends AbstractReason public void reason() System.out.println(Go Home!); public class GoToilet extends AbstractReason public void reason() System.out.println(Go to Toilet!); public class OnTheWay extends AbstractReason public voi
18、d reason() System.out.println(On The Way!); public class ReasonFactory public static AbstractReason produceReason (String excuse) throws Exception if(excuse.equalsIgnoreCase(Toilet) System.out.println(The ReasonFactory produces the reason of Toilet!); return new GoToilet(); else if(excuse.equalsIgno
19、reCase(Home) System.out.println(The ReasonFactory produces the reason of go home); return new GoHome(); else if(excuse.equalsIgnoreCase(OnTheWay) System.out.println(The ReasonFactory produces the reason of on the way!); return new OnTheWay(); else throw new Exception(Sorry! The reason is not true!);
20、 public class Client_xml public static void main(String args) try AbstractReason abstractreason; String excuse=XMLUtilReason.getexcuse(); abstractreason=ReasonFactory.produceReason(excuse); /abstractreason=ReasonFactory.produceReason (Home); abstractreason.reason(); catch(Exception e) System.out.pri
21、ntln(e.getMessage(); public class Client public static void main(String args) try AbstractReason abstractreason; abstractreason=ReasonFactory.produceReason (Toilet); abstractreason.reason(); catch(Exception e) System.out.println(e.getMessage(); 3.简历题目(浅克隆)需要有一个简历类,必须要有姓名,可以设置性别和年龄,可以设置工作经历。最终需要三份简历。
22、public class Resume implements Cloneable private String name; private String sex; private String age; private WorkExperience workexperience=null; public Resume(String name) this.name=name; this.workexperience=new WorkExperience(); public void setName(String name) this.name=name; public void setPerso
23、nalInfo(String sex, String age) this.sex=sex; this.age=age; public String getName() return (this.name); public String getSex() return(this.sex); public String getAge() return(this.age); public void setWorkExperience(String workDate, String Company) workexperience.setworkDate(workDate); workexperienc
24、e.setCompany(Company); public WorkExperience getWorkExperience() return this.workexperience; public Object clone() Resume clone=null; try clone=(Resume)super.clone(); catch(CloneNotSupportedException e) System.out.println(Clone failure!); return clone; public void display() System.out.println(Resume
25、:+ +this.getName()+ +this.getAge()+ +this.getSex(); System.out.println(Experience:+ +workexperience.getworkDate()+ +workexperience.getCompany(); public class WorkExperience private String workDate; private String Company; public void setworkDate(String workDate) this.workDate=workDate; public void s
26、etCompany(String Company) this.Company=Company; public String getworkDate() return (this.workDate); public String getCompany() return(this.Company); public class Client public static void main(String args) Resume resume,copy1,copy2; resume=new Resume(zhangsan); resume.setPersonalInfo(male, 25); resu
27、me.setWorkExperience(1995-1997,Company1); copy1=(Resume)resume.clone(); copy2=(Resume)resume.clone(); resume.display(); copy1.setName(lisi); copy1.setWorkExperience(2004-2007,Company2); copy1.display(); copy2.setPersonalInfo(female, 30); copy2.display(); System.out.println(resume=copy1); System.out.println(copy1=copy2); System.out.println(resume.getWorkExperience()=copy1.getWorkExperience(); System.out.println(copy1.getWorkExperience()=copy2.getWorkExperience(); 陈俊生版public class Resume implements Cloneable private String name;/姓名 private String se
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1