黑马程序员技术交流社区
标题:
关于面向对象的思考
[打印本页]
作者:
刘永菲
时间:
2012-4-15 22:11
标题:
关于面向对象的思考
面向对象着重在于思维方式。对象首先满足复杂化到简单化,其次地位转换由执行者转换为指挥者。毕老师举了买电脑和应聘的例子。我自己想了一个例子,如自己有一套房子现在要将其出售,那么我找一个对象房屋中介,并使用对象中的功能寻找买主,这样就把我从自己在房屋市场寻找买主的过程中解放出来,对象简单化,也满足我的地位转换(执行者转指挥者),这是否是一个面向对象的事例呢?希望大家能帮我完善这个问题。
作者:
曾虓
时间:
2012-4-16 11:39
根据你的业务分析:
这应该是一个观察者模式:
观察者模式的概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新。
你自己作为具体的主题,其他求租人员是具体的观察者,你发布信息给所有的具体观察者。
Uml图
30.png
(11.55 KB, 下载次数: 25)
下载附件
2012-4-16 11:38 上传
代码如下:
主题:
//主题
public interface Subject {
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifuObserver();
}
复制代码
观察者:
//观察者
public interface Observer {
public void hearTelephone(String headMess);
}
复制代码
具体主题:
import java.util.ArrayList;
//具体主题:房屋中心
public class SeekHouseCenter implements Subject {
String mess;
boolean changed;
ArrayList<Object> personList;// 存放观察者引用的数组线性表
SeekHouseCenter() {
personList = new ArrayList<Object>();
mess = "";
changed = false;
}
@Override
public void addObserver(Observer o) {
if (!personList.contains(o)) {
personList.add(o);// 把观察者的引用添加到数组线性表
}
}
@Override
public void deleteObserver(Observer o) {
if (personList.contains(o)) {
personList.remove(o);
}
}
@Override
public void notifuObserver() {
if (changed) {// 通知所有的观察者
for (int i = 0; i < personList.size(); i++) {
Observer observer = (Observer) personList.get(i);// 让观察者听电话
observer.hearTelephone(mess);
}
changed = false;
}
}
public void giveNewMess(String str) {
if (str.equals(mess)) {
changed = false;
} else {
mess = str;
changed = true;
}
}
}
复制代码
具体观察者:
//具体的观察者:屌丝
public class DiaoSi implements Observer {
Subject subject;
String name;
DiaoSi(Subject subject, String name) {
this.subject = subject;
this.name = name;
subject.addObserver(this);
}
@Override
public void hearTelephone(String headMess) {
if (headMess.contains("小房间")) {
System.out.println("我是一个屌丝:" + "我名叫" + name);
System.out.println("太好了,有个小房间可以租." + "我租了:" + headMess);
} else {
System.out.println("我是屌丝,这里没有我要租的房子");
}
}
}
//具体的观察者:高富帅
public class GaoFuShuai implements Observer {
Subject subject;
String name;
GaoFuShuai(Subject subject,String name){
this.subject=subject;
this.name=name;
subject.addObserver(this);
}
@Override
public void hearTelephone(String headMess) {
System.out.println("我是高富帅:"+"我名叫"+name);
System.out.println("钱不是问题."+"我租了:"+headMess);
}
}
复制代码
模式使用:
public class Application {
public static void main(String[] args) {
SeekHouseCenter center = new SeekHouseCenter();// 具体主题,也就是你自己
DiaoSi diaoSiA = new DiaoSi(center, "王小二");
DiaoSi diaoSiB = new DiaoSi(center, "张三");
GaoFuShuai gaoFuShuaiA = new GaoFuShuai(center, "阿帅");
System.out.println("我发布了房屋信息1:");
System.out.println("-----------------------");
center.giveNewMess("超级豪华别墅");// 具体主题给出信息,也就是你发布房屋信息
center.notifuObserver();// 具体主题通知信息
System.out.println("我发布了房屋信息2:");
System.out.println("-----------------------");
center.giveNewMess("小房间");// 具体主题给出信息,也就是你发布房屋信息
center.notifuObserver();// 具体主题通知信息
}
}
复制代码
输出结果如图
40.png
(13.98 KB, 下载次数: 30)
下载附件
2012-4-16 11:39 上传
希望这些代码能给你启示。
作者:
曾虓
时间:
2012-4-16 11:49
本帖最后由 曾虓 于 2012-4-16 11:51 编辑
Uml图我自己画的,用myeclipse正向工程生成后再修改的。
作者:
刘永菲
时间:
2012-4-16 21:30
膜拜啊,高手啊。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2