黑马程序员技术交流社区
标题:
[转自]CSDN 关于"面向对象"思想编程
[打印本页]
作者:
白堇翎
时间:
2013-8-22 21:59
标题:
[转自]CSDN 关于"面向对象"思想编程
本帖适合已经学习完java基础,开始学习高新技术的同学原帖地址猛击我
花了点时间给两个楼主解答,同时希望初学者少走弯路,不要在为“面向对象”而面向对象,要提前理解JavaBean+DAO的模式(简单的说,就是把数据和方法完全分离;如果实在还不理解,就回忆下C语言的"结构体+函数式"编程的思想,面向过程你能理解吧,换了个更简单的面向对象怎么就纠结了?),简化今后的编程,加快JavaSE学习的速度。
为什么现在有泛型,为什么有反射,为什么有纯POJO?这些思想就是要让你的“数据”和“操作”完全分离;
类似于“冰箱具有--开打、关闭方法,汽车具有--行驶、刹车方法”的代码绝对绝对不能再出现在Pojo当中了!
以后谁再写以下这种2B代码你们项目经理跟你没完!
package beantest.bean;
/**
*冰箱
*
*/
public class Fridge {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 冰箱具有打开的行为
*/
public void open(){
System.out.println("打开"+name);
}
/**
* 冰箱具有关闭的行为
*/
public void close(){
System.out.println("关闭"+name);
}
}
复制代码
企业级的设计思路有MVC以及SSH框架的单例、代理、Aop等等,
但面向对象基本上只有
Dao+JavaBean,没有其他;连继承都很少,纵观马士兵、张孝祥、韩顺平的SSH视频,只找到两个:HibernateTemplate、ActionSupport而已;所以,如果初学者再过分的纠结于所谓的抽象、封装、继承、多态,只会耽误学习Java的进度!
比如一个帖子问到:
老王和老李是夫妻。老王是一名大学教授,老李是一名会计,他们的父母都健在。老王和老李有一个儿子,15岁了,在上中学。老王有时候去打太极拳,老李有时候去兼职讲课。用OO的思想描述他们的关系
可以这样解答,
诸位可能有更加优美的代码
,
但设计思路在20年之内是不会变的
。
下面是项目的包结构:
db里边是数据库(我们现在用List代替真正的数据库)
bean包里边是实体(习惯上称为JavaBean、POJO、Entity等等)
dao包里边是增删改查的类(对一个数据的基本操作就是CRUD)
logic包是业务逻辑层(如:判断两人是否是夫妻,判断父母是否健在等等)
util包用于存放:数据字典以及一些常用的正则、IO、日期的工具类
1375561374_486461.jpg
(20.46 KB, 下载次数: 25)
下载附件
2013-8-22 21:50 上传
package beantest.bean;
/**
*爱好
*
*/
public class Hobby {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hobby(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Hobby [id=" + id + ", name=" + name + "]";
}
}
复制代码
package beantest.bean;
/**
* 职业
*/
public class Job {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Job(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Job() {
super();
}
@Override
public String toString() {
return "Job [id=" + id + ", name=" + name + "]";
}
}
复制代码
package beantest.bean;
import java.util.List;
/**
* 人
*/
public class Person {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 姓名
*/
private String name;
/**
* 性别 1-男 2-女
*/
private int male;
/**
* 年龄
*/
private int age;
/**
* 是否在世
*/
private boolean isLive;
/**
* 父亲id引用 -1表示不存在
*/
private int fatherId;
/**
* 母亲id引用 -1表示不存在
*/
private int motherId;
/**
* 爱人的id引用 -1表示不存在
*/
private int loverId;
/**
* 职业的id引用 -1表示不存在
*/
private int jobId;
/**
* 由于可以有多个爱好,所以一个人拥有爱好ID的集合
*/
private List<Integer> hobbyList;
public List<Integer> getHobbyList() {
return hobbyList;
}
public void setHobbyList(List<Integer> hobbyList) {
this.hobbyList = hobbyList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMale() {
return male;
}
public void setMale(int male) {
this.male = male;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean isLive) {
this.isLive = isLive;
}
public int getFatherId() {
return fatherId;
}
public void setFatherId(int fatherId) {
this.fatherId = fatherId;
}
public int getMotherId() {
return motherId;
}
public void setMotherId(int motherId) {
this.motherId = motherId;
}
public int getLoverId() {
return loverId;
}
public void setLoverId(int loverId) {
this.loverId = loverId;
}
public int getJobId() {
return jobId;
}
public void setJobId(int jobId) {
this.jobId = jobId;
}
public Person() {
super();
}
public Person(int id, String name, int male, int age, boolean isLive,
int fatherId, int motherId, int loverId, int jobId) {
super();
this.id = id;
this.name = name;
this.male = male;
this.age = age;
this.isLive = isLive;
this.fatherId = fatherId;
this.motherId = motherId;
this.loverId = loverId;
this.jobId = jobId;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", male=" + male + ", age="
+ age + ", isLive=" + isLive + ", fatherId=" + fatherId
+ ", motherId=" + motherId + ", loverId=" + loverId + ", jobId="
+ jobId + "]";
}
}
复制代码
package beantest.dao;
import java.util.List;
/**
*单表 CRUD的类
*/
public class BaseDao<T> {
/**
* 操作哪个表
*/
private List<T> table;
public BaseDao(List<T> table) {
super();
this.table = table;
}
/**
* 插入
*/
public void insert(T t){
table.add(t);
}
/**
* 查询
*/
public T query(int id){
return table.get(id);
}
/**
* 修改
*/
public void update(T t,int id){
table.set(id, t);
}
/**
* 删除
*/
public T delete(int id){
return table.remove(id);
}
}
复制代码
package beantest.db;
import java.util.ArrayList;
import java.util.List;
import beantest.bean.Hobby;
import beantest.bean.Job;
import beantest.bean.Person;
import beantest.util.Dectionary;
/**
*数据库,每个数据库的记录的id从0开始
*
*/
public class DataBase {
public static List<Person> personDb=new ArrayList<Person>();
public static List<Job> jobDb=new ArrayList<Job>();
public static List<Hobby> hobbyDb=new ArrayList<Hobby>();
//初始化数据库并设置关联
static{
//初始化person数据库
Person p0=new Person(0, "老王的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 1,-1);
Person p1=new Person(1, "老王的母亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 0,-1);
Person p2=new Person(2, "老李的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 3,-1);
Person p3=new Person(3, "老李的父亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 2,-1);
Person p4=new Person(4, "老王", Dectionary.Male, 40, Dectionary.Live, 0, 1, 5,0);
Person p5=new Person(5, "老李", Dectionary.Female, 40, Dectionary.Live, 2, 3, 4,1);
Person p6=new Person(6, "儿子", Dectionary.Male, 15, Dectionary.Live, 4, 5, -1, 2);
personDb.add(p0); personDb.add(p1); personDb.add(p2); personDb.add(p3);
personDb.add(p4); personDb.add(p5); personDb.add(p6);
//初始化job数据库
Job job0=new Job(0, "教师");
Job job1=new Job(1, "会计");
Job job2=new Job(2, "上中学");
jobDb.add(job0);jobDb.add(job1);jobDb.add(job2);
//初始化hobby数据库
Hobby h0=new Hobby(0, "太极拳");
Hobby h1=new Hobby(0, "兼职讲课");
hobbyDb.add(h0);
hobbyDb.add(h1);
//设置爱好
List<Integer> wangList=new ArrayList<Integer>();
List<Integer> liList=new ArrayList<Integer>();
wangList.add(0);
liList.add(1);
p0.setHobbyList(wangList);
p1.setHobbyList(liList);
}
}
复制代码
作者:
白堇翎
时间:
2013-8-22 21:59
(接主楼)
package beantest.logic;
import beantest.bean.Hobby;
import beantest.bean.Job;
import beantest.bean.Person;
import beantest.dao.BaseDao;
import beantest.db.DataBase;
import beantest.util.Dectionary;
/**
*业务逻辑的类
*
*/
public class LogicClass {
BaseDao<Person> personDao=new BaseDao<Person>(DataBase.personDb);
BaseDao<Job> jobDao=new BaseDao<Job>(DataBase.jobDb);
BaseDao<Hobby> hobbyDao=new BaseDao<Hobby>(DataBase.hobbyDb);
/**
* 判断两个人是否是夫妻关系,并输出谁是丈夫,谁是妻子
*/
public boolean assertHusbanAndWife(int id1,int id2){
Person p1=personDao.query(id1);
Person p2=personDao.query(id2);
boolean flag=false;
if(p1.getLoverId()==id2&&p2.getLoverId()==id1){
flag=true;
System.out.println(p1.getName()+"和"+p2.getName()+"是夫妻");
if(p1.getMale()==Dectionary.Male){
System.out.println(p1.getName()+"是丈夫\t"+p2.getName()+"是妻子");
}else{
System.out.println(p2.getName()+"是丈夫\t"+p1.getName()+"是妻子");
}
}
return flag;
}
/**
*显示人的职业
*/
public void printPersonJob(int personId){
Person p=personDao.query(personId);
Job j=jobDao.query(p.getJobId());
System.out.println(p.getName()+"是一名"+j.getName());
}
/**
*判断一个人的父母是否健在
*/
public boolean juggParent(int personId){
boolean flag=false;
Person p=personDao.query(personId);
Person father=personDao.query(p.getFatherId());
Person mother=personDao.query(p.getMotherId());
if(father.isLive()&&mother.isLive()){
flag=true;
System.out.println(p.getName()+"的父母健在");
}else if(father.isLive()){
flag=false;
System.out.println(p.getName()+"只有父亲健在");
}else if(mother.isLive()){
flag=false;
System.out.println(p.getName()+"只有母亲健在");
}
return flag;
}
/**
* 根据父母的ID查询孩子
*/
public Person queryChildByParent(int fatherId,int motherId){
Person child=null;
for(Person p:DataBase.personDb){
if(p.getFatherId()==fatherId&&p.getMotherId()==motherId){
child=p;
Person father=personDao.query(fatherId);
Person mother=personDao.query(motherId);
Job job=jobDao.query(child.getJobId());
System.out.println(father.getName()+"和"+mother.getName()+"有一个儿子,"+child.getAge()+"岁了,在"+job.getName());
break;
}else{
continue;
}
}
return child;
}
/**
*描述谁做什么的方法
*/
public void personDoSth(int personId,String what,int hobbyId){
Person p=personDao.query(personId);
Hobby h=hobbyDao.query(hobbyId);
System.out.println(p.getName()+"有时候"+what+h.getName());
}
public static void main(String[] args) {
LogicClass lc=new LogicClass();
//老王和老李是夫妻
lc.assertHusbanAndWife(4, 5);
//老王是一名大学教授,老李是一名会计
lc.printPersonJob(4);lc.printPersonJob(5);
//他们的父母都健在
lc.juggParent(4);lc.juggParent(5);
//老王和老李有一个儿子,15岁了,在上中学
lc.queryChildByParent(4, 5);
//老王有时候去打太极拳,老李有时候去兼职讲课
lc.personDoSth(4, "去打",0);lc.personDoSth(5, "去",1);
}
}
复制代码
package beantest.util;
/**
*数据字典
*
*/
public class Dectionary {
/**
* 男人
*/
public static final int Male=1;
/**
* 女人
*/
public static final int Female=2;
/**
* 活着
*/
public static boolean Live=true;
/**
* 死亡
*/
public static boolean Dead=false;
}
复制代码
输出
老王和老李是夫妻
老王是丈夫 老李是妻子
老王是一名教师
老李是一名会计
老王的父母健在
老李的父母健在
老王和老李有一个儿子,15岁了,在上中学
老王有时候去打太极拳
老李有时候去兼职讲课
复制代码
(感言)
我觉得这种描述对象的方法的确很细致.
把对象的每种属性都描述成了一个对象.
然后在人这个对象中调用各项属性的对象.最后把人存储到集合中.
作者:
刘张朋
时间:
2013-8-24 21:58
看的我是一头雾水啊,哥们,牛{:soso_e179:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2