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,那麼接下來我就根據這幾個法寶來一一表達我的觀點。我說了希望大家來交流和拍板,大家共同學習,共同進步。