Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1078880
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 嵌入式

2012-02-28 12:41:20

今天我们来介绍一下观察者模式,观察者模式需要有目标对象,有观察对象。

目标对象的改变会通知观察对象也做出相应的变化。

接上一回的话题《西游记》,唐僧就是目标对象,他的三个徒弟就是保护他去西天取经的,所以他是三个徒弟的目标对象。那每一个徒弟就是观察对象,如果唐僧被妖怪抓去的话,徒弟们是要去救他的,不然没有唐僧,徒弟们去西天也是没用的,呵呵,我们来看一下具体的代码呢:

将唐僧设为目标者,将每个观察者注册给他,就是他如果出事的话,能通知到徒弟们去救他啊!

  1. public class Tangseng {  
  2.   
  3.     ArrayList lists;  
  4.   
  5.     public Tangseng() {  
  6.         lists = new ArrayList();  
  7.     }  
  8.   
  9.     public void register(Person p) {  
  10.         lists.add(p);  
  11.     }  
  12.   
  13.     public void unRegister(Person p) {  
  14.         lists.remove(p);  
  15.     }  
  16.   
  17.     public ArrayList help() {  
  18.   
  19.         ArrayList arraylist = new ArrayList();  
  20.   
  21.         for (Person p : lists) {  
  22.             arraylist.add(p.save());  
  23.         }  
  24.   
  25.         return arraylist;  
  26.   
  27.     }  
  28.   
  29. }  
接下来就是三个徒弟类了,每个徒弟都有一个救师傅的方法,这是悟空类:

  1. public class Wukong implements Person {  
  2.   
  3.     @Override  
  4.     public String getName() {  
  5.   
  6.         return "孙悟空";  
  7.     }  
  8.   
  9.     @Override  
  10.     public String save() {  
  11.   
  12.         return this.getName() + "去救师傅了";   
  13.     }  
  14.   
  15. }  
八戒类:

  1. public class Bajie implements Person {  
  2.   
  3.     @Override  
  4.     public String getName() {  
  5.   
  6.         return "八戒";  
  7.     }  
  8.       
  9.     @Override  
  10.     public String save() {  
  11.            
  12.         return this.getName() + "去救师傅了";   
  13.     }  
  14.   
  15. }  
沙僧类:

  1. public class Shaseng implements Person {  
  2.   
  3.     @Override  
  4.     public String getName() {  
  5.   
  6.         return "沙僧";  
  7.     }  
  8.   
  9.     @Override  
  10.     public String save() {  
  11.   
  12.         return this.getName() + "去救师傅了";  
  13.     }  
  14.   
  15. }  
师傅一喊救命,三个徒弟就会去救他,这里最后的实现类:

  1. public class XiyoujiActivity extends Activity {  
  2.   
  3.     private ListView listView;  
  4.   
  5.     /** Called when the activity is first created. */  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.   
  11.         listView = (ListView) findViewById(R.id.listView1);  
  12.   
  13.         Tangseng tangseng = new Tangseng();  
  14.         tangseng.register(new Wukong());  
  15.         tangseng.register(new Bajie());  
  16.         tangseng.register(new Shaseng());  
  17.   
  18.         ArrayList lists = tangseng.help();  
  19.   
  20.         ArrayAdapter adapter = new ArrayAdapter(this,  
  21.                 android.R.layout.simple_list_item_1, lists);  
  22.   
  23.         listView.setAdapter(adapter);  
  24.   
  25.     }  
  26. }  
好了,看一下图吧


当然,我们也可以实现其他的方法,例如:唐僧说吃饭,那每个徒弟就吃饭,看一下改过的代码呢

  1. Tangseng tangseng = new Tangseng();  
  2.         tangseng.register(new Wukong());  
  3.         tangseng.register(new Bajie());  
  4.         tangseng.register(new Shaseng());  
  5.   
  6.         ArrayList lists = tangseng.eat();  
我们将唐僧的help改成eat方法

  1. public ArrayList eat() {  
  2.   
  3.         arraylist = new ArrayList();  
  4.   
  5.         for (Person p : lists) {  
  6.   
  7.             arraylist.add(p.eat());  
  8.         }  
  9.   
  10.         return arraylist;  
  11.   
  12.     }  
然后每个徒弟实现了eat的方法,最后产生的效果如下:


好了,观察者模式这里就讲完了,有问题欢迎大家留言。

阅读(1239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~