实验四 面向抽象编程

1(houseOwner.java,People.java,Worker.java,Decorator.java, Electricia.java,Woodworking.java,Geotechnical.java,Painter.java,Demo.java(调试展示类)):装修需要找土工,电工,木工,油漆工,四类工人,土工负责砌墙,贴瓷砖,电工负责埋电线和水管,木工负责做家具,油漆工负责粉刷,房东需要寻找这四种工人完成各自的任务。

具体要求:四类工人继承工人类,工人和房东都继承people类。

people 类具有:身份证号ID,姓名name,电话Tel,性别sex;

工人类worker具有:price(时薪),certificate(职业证书),company(所属公司);

四种工人都能实现室内装修(Decorator)的接口,该接口有一方法:doWork()

四种工人实现该接口,并实现doWork方法.

 

房东(houseOwner)有自己的属性:要装修的房子addr(字符串), 装修的钱decorateFund(实数),

房东有自己的方法:装修decorate(),该方法带参数,可以是电工,土工,油漆工,木工,执行内容为调用这些工人的doWork方法。能根据不同的工种打印出

我是土工,负责砌墙,贴瓷砖

我是电工,负责埋电线和水管

我是木工,负责做家具

我是油漆工,负责粉刷

 

2(Book.java,Boss.java,Secretary.java,Demo.java(调试展示类)):思考设计以下相关的类

秘书和老板都能预订酒店,老板告诉秘书房间价位在500到1500之间都可以预定,在500以下不预定,在1500元以上需经过老板同意。老板再根据具体情况(情况是否紧急等、自己发挥)决定是否预定酒店。

接口的代理模式(房产中介是房东的代理,它们都能实现出租和收租金,他们实现同一个接口。但有了中介,可以提前做些审核的工作,审核房东或求租者等一系列工作。以此类推,可以推广到所有相关的代理需求,如秘书和老板的关系(可以直接约老板也可以通过秘书预约,通过秘书就不用烦老板了,秘书会回绝一些不满足条件的客人等)).

 

3(Atm.java,Counter.java,Bank.java,Function.java,People.java,Demo.java(调试展示类)):ATM机和柜台工作人员都能实现取钱和存钱的功能,设计储户存取钱的操作,有两个参数:账号(存折或银行卡)和存取钱的设备(ATM机或柜台),思考,该如何设计相应的类和接口(抽象类)来实现前述功能,要注意存取钱具体实现的合理性?

  1. 源程序代码(1个接口,8个类)

Electrician.java:

public class Electrician extends Worker implements Decorator{//继承工人类以及一个装饰的接口

   public void dowork(){//电工类的方法

     System.out.println("我是电工,负责埋电线和水管。");

   }

}

Woodworking.java:

public class Woodworking extends Worker implements Decorator{//继承工人类以及一个装饰的接口

   public void dowork(){//木工类的方法

     System.out.println("我是木工,负责做家具。");

   }

}

Geotechnical.java:

public class Geotechnical extends Worker implements Decorator{//继承工人类以及一个装饰的接口

   public void dowork(){//土工类的方法

     System.out.println("我是土工,负责砌墙,贴瓷砖。");

   }

}

Painter.java:

public class Painter extends Worker implements Decorator{//继承工人类以及一个装饰的接口

   public void dowork(){//油漆工类的方法

     System.out.println("我是油漆工,负责粉刷。");

   }

}

Decorator.java:

public interface Decorator {

   public abstract void dowork();//接口,让接上的去实现具体方法

}

People.java:

public class People {

   public String id;//身份证号码

   public String name;//姓名

   public String tel;//电话号码

   public String sex;//性别

   People(){//默认的构造函数,有时候会用到

    

   }

   People(String id,String name,String tel,String sex){//构造函数进行属性的初始化

     this.id = id;

     this.name = name;

     this.tel = tel;

     this.sex = sex;

   }

   public void showInformation() {//展示个人信息的方法

     System.out.println(this.name+"的信息如下:");

     System.out.printf("姓名:%s  性别:%s  身份证号码:%s  电话号码:%s\n",this.id,this.sex,this.id,this.tel);

   }

}

Worker.java:

public class Worker extends People{//工人类继承人类

   public double price;//价格

   public String certificate;//职业证书

   public String company;//所属公司

   Worker(){//因为父类有构造函数,所以子类也必须要有,不然不能对父类进行默认的构造函数

     super();

   }

   Worker(String id,String name,String tel,String sex,double price,String certificate,String company){

     super(id,name,tel,sex);//构造函数的初始化

     this.price = price;

     this.certificate = certificate;

     this.company = company;

   }

}

HouseOwner.java:

public class houseOwner extends People{

   public String addr;//装饰的地址

   public String decorateFund;//装饰的资金

   houseOwner(String id,String name,String tel,String sex,String addr,String money){

     super(id,name,tel,sex);//初始化房东的个人信息以及装饰信息

     this.addr = addr;

     this.decorateFund = money;

   }

   public void showDecorateInformation() {//展示装饰信息的方法

     System.out.println("装修信息:");

     System.out.printf("装修地点:%s  装修资金:%s\n",this.addr,this.decorateFund);

   }

   public void decorate(Decorator worker) {//雇佣工人的方法

     worker.dowork();

   }

}

Demo.java:

public class Demo {

   public static void main(String[] args) {

     houseOwner owner = new houseOwner("3171911134","黄湘平","13110520342","","福州","一百万");//初始化房东的信息以及装饰的信息

     owner.showInformation();//展示房东的信息

     owner.showDecorateInformation();//展示房东的装饰信息

     owner.decorate(new Geotechnical());//请土工装饰的调用方法

     owner.decorate(new Woodworking());//请木工装饰的调用方法

     owner.decorate(new Electrician());//请电工装饰的调用方法

     owner.decorate(new Painter());//请油漆工装饰的调用方法

   }

}

 

2.源程序代码(1个接口,3个类)

Book.java:

public interface Book {//预定酒店的接口

   public abstract void book();//具体的方法由使用这个接口的对象来写

}

Boss.java:

public class Boss implements Book{//老板类继承预定的接口

   public boolean situation;//老板的情况是否紧急

   Boss(){//默认的构造函数,有时候会用上

    

   }

   Boss(boolean situation){//初始化老板的情况是否紧急

     this.situation = situation;

   }

   public void book() {//老板预定酒店的方法

     System.out.println("老板预定酒店");

   }

   public boolean condition() {//查看老板的情况是否紧急

     if(this.situation) {

        System.out.println("情况紧急!!!");

        return this.situation;//返回具体的紧急情况

     }else {

        System.out.println("情况尚好。");

        return this.situation;//与上面一样

     }

   }

}

Secretary.java:

public class Secretary implements Book{//秘书也接上预定酒店的接口

   public int money;//酒店的价格

   public Boss boss;//秘书的老板

   public void bossTell(int money,Boss boss) {//酒店价格的初始化,以及老板的情况的初始化的方法

     this.money = money;

     this.boss = boss;

   }

   public void book() {//秘书判断条件进行预定酒店

     if(this.money>0 && this.money<500) {//0-500肯定预定

        System.out.println("秘书预定酒店");

     }else if(this.money>=500 && this.money<=1500) {//500-1500也预定

        System.out.println("秘书预定酒店");

     }else if(this.money>1500) {//如果大于1500,再查看老板的情况是否紧急

        if(this.boss.condition()) {//如果紧急就预定

           System.out.println("秘书预定酒店");

        }else {//不紧急就不预定

           System.out.println("价格较贵,不预定酒店");

        }

     }

   }

  

}

Demo.java:

public class Demo {

   public static void main(String[] args) {

     Boss boss = new Boss(false);//初始化老板的情况不紧急

     boss.book();//老板预定酒店

     Secretary secretary = new Secretary();//初始化一个秘书

     secretary.bossTell(1800,boss);//输入酒店价格,以及老板的情况

     secretary.book();//判断之后进行是否预定酒店

   }

}

 

3.源程序代码(2个接口,6个类)

CardType.java:

public interface CardType {//卡的种类的接口

   public abstract void bankSave(double money);//存钱的抽象方法

   public abstract void bankDraw(double money);//取钱的抽象方法

   public abstract void showAccount();//展示银行卡号或者存折号码的抽象方法

}

OperateEquipment.java:

public interface OperateEquipment {//接口

   public abstract void equipmentShow(CardType type);//显示在什么设备展示的抽象方法

}

Atm.java:

public class Atm implements OperateEquipment{//ATM类接上操作设备的接口

   public void equipmentShow(CardType type) {

     type.showAccount();//这个是展示银行卡号或者存折号码的方法

     System.out.printf("ATM机上,");//这个是显示在ATM设备操作的方法

   }

}

Counter.java:

public class Counter implements OperateEquipment{//柜台类接上操作设备的接口

   public void equipmentShow(CardType type) {

     type.showAccount();//这个是展示银行卡号或者存折号码的方法

     System.out.printf("在柜台上,");//这个是显示在柜台设备操作的方法

   }

}

BankBook.java:

public class BankBook implements CardType{

   public String bankBookAccount;//存折号码

   public static double sumMoney;//存折的总额应该是静态的

   BankBook(){//默认的构造函数,有时候没有初始化就单纯new一个对象的时候用的上

    

   }

   BankBook(String bankBookAccount){//初始化存折的号码以及总额

     this.bankBookAccount = bankBookAccount;

     sumMoney = 0;

   }

   public void showAccount() {//展示存折号码的方法

     System.out.println("存折号码:"+bankBookAccount);

   }

   public void bankSave(double money) {//往存折存钱的方法

     sumMoney+=money;

     System.out.println(""+money+"");

     System.out.println("存折余额:"+sumMoney);

   }

   public void bankDraw(double money) {//往存折取钱的方法

     if(money>sumMoney) {

        System.out.println("存折余额不够");

     }else {

        System.out.println(""+money+"");

        sumMoney-=money;

     }

     System.out.println("存折余额:"+sumMoney);

   }

}

BankCard.java:

public class BankCard implements CardType{//银行类

   public String bankCardAccount;//银行卡号

   public static double sumMoney;//银行卡的总额应该是静态的

   BankCard(){//默认的构造函数,有时候没有初始化就单纯new一个对象的时候用的上

    

   }

   BankCard(String bankCardAccount){//初始化银行卡的号码以及总额

     this.bankCardAccount = bankCardAccount;

     sumMoney = 0;

   }

   public void showAccount() {//展示银行卡号的方法

     System.out.println("银行卡号:"+bankCardAccount);

   }

   public void bankSave(double money) {//往银行卡存钱的方法

     sumMoney+=money;

     System.out.println(""+money+"");

     System.out.println("银行卡余额:"+sumMoney);

   }

   public void bankDraw(double money) {//往银行卡取钱的方法

     if(money>sumMoney) {

        System.out.println("银行卡余额不足");

     }else {

        System.out.println(""+money+"");

        sumMoney-=money;

     }

     System.out.println("银行卡余额:"+sumMoney);

   }

}

User.java:

public class User {

   public String name;//名字

   public BankBook bankBook;//人的存折

   public BankCard bankCard;//人的银行卡

   User(){//默认的构造函数,有时候没有初始化就单纯new一个对象的时候用的上

    

   }

   User(String name){//构造函数,对名字初始化

     this.name = name;

   }

   public void createBankBook(String account) {//办存折的方法

     this.bankBook = new BankBook(account);

   }

   public void createBankCard(String account) {//办银行卡的方法

     this.bankCard = new BankCard(account);

   }

   public void operateSave(CardType bank,OperateEquipment equip,double money) {//存钱操作的方法

     equip.equipmentShow(bank);

     bank.bankSave(money);

   }

   public void operateDraw(CardType bank,OperateEquipment equip,double money) {//取钱操作的方法

     equip.equipmentShow(bank);

     bank.bankDraw(money);

   }

}

Demo.java:

public class Demo {

   public static void main(String[] args) {

     User user = new User("黄湘平");//声明并初始化一个对象

     Atm atm = new Atm();//声明并初始化一个ATM

     Counter counter = new Counter();//声明并初始化一个柜台

     user.createBankBook("3171911134");//办存折

     user.createBankCard("6212261400003388990");//办银行卡

     user.operateSave(user.bankCard,atm,1000);//ATM机往银行卡上存1000

     user.operateSave(user.bankBook,counter,2500);//在柜台往存折上存2500

     user.operateDraw(user.bankCard, counter, 500);//在柜台往银行卡上取500

     user.operateDraw(user.bankBook,counter,1000);//在柜台往存折上取1000

     user.operateDraw(user.bankCard, atm,800);//ATM机往银行卡上取800

   }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值