Java

实例谈谈Java面向对象

虽然我学JAVA两年多了,基础还可以,一些常用的框架也会弄,设计模式也会个几种。但是我还不敢我说我JAVA或者软件多么多么在行,对面向对象思想有多少多少领悟。那为什么我还要在这里对人现眼呢,嗯,我还是想用一个JAVA初级水平的角色和大家一起来探讨JAVA软件编程的经验,分享自己的见地,欢迎喜爱JAVA的朋友前来拍板提出异议。

java面向对象

大家都知道JAVA的核心就是面向对象思想,也就是OO,但是说起来很容易,真正想弄个透彻,并不是那么容易的。说来说去面向对象的特征也就那几个:抽象,封装,继承,多态,其实一个抽象就可能难倒70%-80%的程序员,包括什么软件工程师(我更喜欢JAVA程序员的职称)。不是说简单就容易,二分法算法很简单吧,可是1947就出现的二分算法,直到1961年才有世界上第一个没有BUG的二分算法(盗用下经典的例子啦)。还是别扯远了,来个例子:

业务需求如下:
1.一个客户可以有多套房子的房贷
2.签署贷款合同以后要监控是否按照还贷计划表来执行
3.自动还款,当多套房贷时,一次还款可能包括多个房贷的额度,需要自动匹配
4.可以提前还款
5.可以延长或缩短贷款的时间
6.利率可以调整
7.滞纳金的问题

是不是看的有点头昏呢,其实我对贷款买房业务也不了解,为了大致把问题用面向对象进行描述,那么我们就开始进行问题抽象(这里不包括领域驱动设计DDD)。

对象分析

首先我们知道肯定有一个事务用来表示贷款买房的人,用Coustomer来表示,他有什么属性呢,人我们就用姓名区分好了,因为他贷款要买房,肯定有一些钱(否则还是不要有买房的念头吧)
房子就用House来表示,房子有什么属性呢,肯定有价格啦,利率啦,年限啦.每个月你要还多少,或者一年还多少(只有爱存不存ICBC,没有爱还不还)。贷款就用Credit来表示,贷款就有客户啦,还钱时间啦,房子啦。

你贷款银行就会跟你签合同,你跑不了了。合同就用agreement来表示,贷款合同有什么属性呢,合同肯定有贷款,是否坏账标记,滞纳金。

业务分析

客户买房子,假设所购的房子已经付了首付(不然银行不可能给你贷,除非你爸是李刚)。要跟银行贷款,那么就要和银行签订贷款合同。
贷款买的房子可能不止一套,我们就不管银监会的神马限购令了。
客户还款,你每隔多少时间还银行钱,那么就会自动根据利率给你匹配计算了(因为银行工作的MM有点懒哦),如果还的钱不够,那么就会给你记坏账了,你拖得太久
银行就会通知你要付款,要是你没有能力还了,银行就会销毁合同,收走你的房,花你的钱,抢你的女朋友,打你的娃(开玩笑啦)。
这里我们的业务方法加了年限和利率的改变实现,主要是为了简单易懂。最好使用JAVA DEGISN PATTER 中的Observer(观察者设计模式)来实现,只要贷款监听倒利率或年限改变,就会自动进行操作。
后面我们再用观察者设计模式来解决这个问题。
package org.javaer.code.test;
import java.util.List;
import java.util.Map;
class Customer {
 /**
  * 客户
  */
 private String username = “donglinmeimei”;
private double money = 0.0;
public String getUsername() {
  return username;
 }
public void setUsername(String username) {
  this.username = username;
 }
public double getMoney() {
  return money;
 }
public void setMoney(double money) {
  this.money = money;
 }
}
class House {
 /**
  * 房子
  */
 private String num = “3#116”;
private double price = 0.0;
private double rax = 0.0;// 利率
private int years = 0;// 年限
public String getNum() {
  return num;
 }
public void setNum(String num) {
  this.num = num;
 }
public double getPrice() {
  return price;
 }
public void setPrice(double price) {
  this.price = price;
 }
public double getRax() {
  return rax;
 }
public void setRax(double rax) {
  this.rax = rax;
 }
public int getYears() {
  return years;
 }
public void setYears(int years) {
  this.years = years;
 }
}
class Credit {
 /**
  * 贷款
  */
 private Customer customer;
 
 private int backTime;
private List<House> housees;
// 每月还多少
 private Map<House, Double> toPay;
public Customer getCustomer() {
  return customer;
 }
public void setCustomer(Customer customer) {
  this.customer = customer;
 }
public int getBackTime() {
  return backTime;
 }
public void setBackTime(int backTime) {
  this.backTime = backTime;
 }
public List<House> getHousees() {
  return housees;
 }
public void setHousees(List<House> housees) {
  this.housees = housees;
 }
public Map<House, Double> getToPay() {
  return toPay;
 }
public void setToPay(Map<House, Double> toPay) {
  this.toPay = toPay;
 }
}
class Agreement {
 /**
  * 合同
  */
 private Credit credit;
 private boolean isContinue;
// 滞纳金
 private double amercement = 0.0;
 public Credit getCredit() {
  return credit;
 }
 public void setCredit(Credit credit) {
  this.credit = credit;
 }
 public boolean isContinue() {
  return isContinue;
 }
 public void setContinue(boolean isContinue) {
  this.isContinue = isContinue;
 }
 public double getAmercement() {
  return amercement;
 }
 public void setAmercement(double amercement) {
  this.amercement = amercement;
 }
 
}
interface BankService {
 // 买房,同时产生贷款和合同
 public void buyHousees(Customer customer, List<House> houseed);
// 还款,计算是否有滞纳金
 public double payMoney(int backTime, Agreement agreement, double money,
   Customer customer);
// 改变利率
 public Map<House, Double> changeRax(House house, double rax);
// 改变年限
 public Map<House, Double> changeYears(House house, int backTime);
}
class BankServiceImpl implements BankService {
public void buyHousees(Customer customer, List<House> houseed) {
 }
public double payMoney(int backTime, Agreement agreement, double money,
   Customer customer) {
  return money;
 }
public Map<House, Double> changeRax(House house, double rax) {
  return null;
 }
public Map<House, Double> changeYears(House house, int backTime) {
  return null;
 }
}
public class Bank{
 public static void main(String[] args) {
  Customer customer = new Customer();
  customer.setUsername(“董林美美”);
  customer.setMoney(10);
 
  List<House> housees = new ArrayList<House>();
  House house = new House();
  house.setNum(“3#116”);
  house.setPrice(1500000);
  house.setRax(0.96);
  house.setYears(20);
  housees.add(house);
 
  House house1 = new House();
  house1.setNum(“4#112”);
  house1.setPrice(1100000);
  house.setRax(0.155);
  house.setYears(30);
  housees.add(house1);
 
  House house2 = new House();
  house2.setNum(“1#001″);
  house2.setPrice(2000000);
  house.setRax(0.12);
  house.setYears(100);
  housees.add(house2);
  
  BankService bs = new BankServiceImpl();
  Credit credit = bs.buyHousees(customer, housees);//买房
  Agreement agreement = bs.orderAgreement(customer, credit);//签订合同
  if(!agreement.isContinue())return;//合同作废
  else{
   agreement.setAmercement(bs.payMoney(1, agreement, 111111, customer));//还款    
   for(Entry<House,Double> entry : agreement.getCredit().getToPay().entrySet()){
    if(agreement.getAmercement().get(entry.getKey())>=entry.getValue()/3){
     agreement.setContinue(false);
     System.out.println(agreement.getCredit().getCustomer().getUsername()+”,你的账户产生坏账,合同终止”);
     break;
    }else{
 
            System.out.println(agreement.getAmercement().get(entry.getKey())>=0?
      agreement.getCredit().getCustomer().getUsername()+”,房子”+entry.getKey().getNum()+”的滞纳金为:”+agreement.getAmercement():””);
    
    }
    Map<House,Double> topay = bs.changeRax(house2, 1.58);//改变利率
    Map<House,Double> topay = bs.changeYears(house2, 50);//改变年限
    System.out.println(agreement.getCredit().getCustomer().getUsername()+”,房 子”+entry.getKey().getNum()+”每月还款金额为:”+entry.getValue());
   
   }
  }
 
 
 }
}
文本内容长度有限制,所以例子就只写这一个了,请大家原谅。
如果面对一个领域的问题,能够进行事务抽象分析,那么问题就好解决了。这需要很长时间的项目锻炼,积累不少经验才能做到。但是今天的一小步,明天的一大步(又涉嫌抄袭了),不要忽视平时的小小的成功。

都说JAVA程序员的三件法宝是Question ,DesignPattern ,framework,那么接下来我就根据这几个法宝来一一表达我的观点。我说了希望大家来交流和拍板,大家共同学习,共同进步。
我的Email:donglinmei@hotmail.com、Mobile Phone :182 5196 5264(翻一下才知道)

今天是第一期,由于时间有限和个人能力有限,做的不好,但我会努力的。下期是JAVA设计模式系列,敬请持续关注。转载请注明出处http://mtoou.info/java-mxdx-zt/