A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘永菲 中级黑马   /  2012-4-15 22:11  /  1704 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

     面向对象着重在于思维方式。对象首先满足复杂化到简单化,其次地位转换由执行者转换为指挥者。毕老师举了买电脑和应聘的例子。我自己想了一个例子,如自己有一套房子现在要将其出售,那么我找一个对象房屋中介,并使用对象中的功能寻找买主,这样就把我从自己在房屋市场寻找买主的过程中解放出来,对象简单化,也满足我的地位转换(执行者转指挥者),这是否是一个面向对象的事例呢?希望大家能帮我完善这个问题。

3 个回复

倒序浏览
根据你的业务分析:
这应该是一个观察者模式:
观察者模式的概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新。
你自己作为具体的主题,其他求租人员是具体的观察者,你发布信息给所有的具体观察者。
Uml图

代码如下:
主题:
  1. //主题
  2. public interface Subject {
  3.         public void addObserver(Observer o);

  4.         public void deleteObserver(Observer o);

  5.         public void notifuObserver();
  6. }
复制代码
观察者:
  1. //观察者
  2. public interface Observer {
  3.         public void hearTelephone(String headMess);
  4. }
复制代码
具体主题:
  1. import java.util.ArrayList;

  2. //具体主题:房屋中心
  3. public class SeekHouseCenter implements Subject {
  4.         String mess;
  5.         boolean changed;
  6.         ArrayList<Object> personList;// 存放观察者引用的数组线性表

  7.         SeekHouseCenter() {
  8.                 personList = new ArrayList<Object>();
  9.                 mess = "";
  10.                 changed = false;
  11.         }

  12.         @Override
  13.         public void addObserver(Observer o) {
  14.                 if (!personList.contains(o)) {
  15.                         personList.add(o);// 把观察者的引用添加到数组线性表
  16.                 }
  17.         }

  18.         @Override
  19.         public void deleteObserver(Observer o) {
  20.                 if (personList.contains(o)) {
  21.                         personList.remove(o);
  22.                 }
  23.         }

  24.         @Override
  25.         public void notifuObserver() {
  26.                 if (changed) {// 通知所有的观察者
  27.                         for (int i = 0; i < personList.size(); i++) {
  28.                                 Observer observer = (Observer) personList.get(i);// 让观察者听电话
  29.                                 observer.hearTelephone(mess);
  30.                         }
  31.                         changed = false;
  32.                 }
  33.         }

  34.         public void giveNewMess(String str) {
  35.                 if (str.equals(mess)) {
  36.                         changed = false;
  37.                 } else {
  38.                         mess = str;
  39.                         changed = true;
  40.                 }

  41.         }

  42. }
复制代码
具体观察者:
  1. //具体的观察者:屌丝
  2. public class DiaoSi implements Observer {
  3.         Subject subject;
  4.         String name;

  5.         DiaoSi(Subject subject, String name) {
  6.                 this.subject = subject;
  7.                 this.name = name;
  8.                 subject.addObserver(this);
  9.         }

  10.         @Override
  11.         public void hearTelephone(String headMess) {
  12.                 if (headMess.contains("小房间")) {
  13.                         System.out.println("我是一个屌丝:" + "我名叫" + name);
  14.                         System.out.println("太好了,有个小房间可以租." + "我租了:" + headMess);
  15.                 } else {
  16.                         System.out.println("我是屌丝,这里没有我要租的房子");
  17.                 }
  18.         }
  19. }
  20. //具体的观察者:高富帅
  21. public class GaoFuShuai implements Observer {

  22.     Subject subject;
  23.     String name;
  24.     GaoFuShuai(Subject subject,String name){
  25.             this.subject=subject;
  26.             this.name=name;
  27.             subject.addObserver(this);
  28.     }
  29.         @Override
  30.         public void hearTelephone(String headMess) {
  31.                 System.out.println("我是高富帅:"+"我名叫"+name);
  32.                 System.out.println("钱不是问题."+"我租了:"+headMess);
  33.         }

  34. }
复制代码
模式使用:
  1. public class Application {

  2.         public static void main(String[] args) {
  3.                 SeekHouseCenter center = new SeekHouseCenter();// 具体主题,也就是你自己

  4.                 DiaoSi diaoSiA = new DiaoSi(center, "王小二");
  5.                 DiaoSi diaoSiB = new DiaoSi(center, "张三");
  6.                 GaoFuShuai gaoFuShuaiA = new GaoFuShuai(center, "阿帅");
  7.                 System.out.println("我发布了房屋信息1:");
  8.                 System.out.println("-----------------------");
  9.                 center.giveNewMess("超级豪华别墅");// 具体主题给出信息,也就是你发布房屋信息
  10.                 center.notifuObserver();// 具体主题通知信息

  11.                 System.out.println("我发布了房屋信息2:");
  12.                 System.out.println("-----------------------");
  13.                 center.giveNewMess("小房间");// 具体主题给出信息,也就是你发布房屋信息
  14.                 center.notifuObserver();// 具体主题通知信息
  15.         }

  16. }
复制代码
输出结果如图


希望这些代码能给你启示。


评分

参与人数 1技术分 +3 收起 理由
技术测试刘老师 + 3 这是自己画的uml分析图吗? 不错啊.

查看全部评分

回复 使用道具 举报
本帖最后由 曾虓 于 2012-4-16 11:51 编辑

Uml图我自己画的,用myeclipse正向工程生成后再修改的。
回复 使用道具 举报
膜拜啊,高手啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马