虽然我学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/