android设计模式-观察者模式

1.什么是观察者模式?

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2.怎么设计一个观察者模式的程序?

确定两个对象:主题和观察者

3.确定这两个对象之间的关系:

主题对象管理某些数据,一旦数据发生改变,会主动向观察者进行通知,然而观察者不必向主题进行索取。

主题并不知道具体的观察者是谁,这是它们之间的关系。

以上涉及到的设计原则:

为了交互对象之间的松耦合设计而努力


开始一个小例子

Observer接口:

[java]  view plain copy
  1. public interface ISubscribe {  
  2.     void getNewPaper();  
  3. }  

实现Observer接口的观察者:

个人订阅者:

[java]  view plain copy
  1. public class PersonalSubscriber implements ISubscribe {  
  2.     private String strName;  
  3.       
  4.     public void setNewsPaperName(String strName){  
  5.         this.strName = strName;  
  6.     }  
  7.       
  8.     public String getNewsPaperName(){  
  9.         return strName;  
  10.     }  
  11.   
  12.     @Override  
  13.     public void getNewPaper() {  
  14.         // TODO Auto-generated method stub  
  15.         System.out.println("我是个人用户,我得到了我的报纸:"+getNewsPaperName());  
  16.     }  
  17.   
  18. }  

企业订阅者:

[java]  view plain copy
  1. public class EnterpriseSubscriber implements ISubscribe {  
  2.     private String strName;  
  3.       
  4.     public void setNewsPaperName(String strName){  
  5.         this.strName = strName;  
  6.     }  
  7.       
  8.     public String getNewsPaperName(){  
  9.         return strName;  
  10.     }  
  11.     @Override  
  12.     public void getNewPaper() {  
  13.         // TODO Auto-generated method stub  
  14.         System.out.println("我是企业用户,我得到了我的报纸:"+getNewsPaperName());  
  15.     }  
  16.   
  17. }  

被观察者:Subject 

[java]  view plain copy
  1. public abstract class Publish {   
  2.     public List<ISubscribe> list;  
  3.     public Publish(){  
  4.         list = new ArrayList();  
  5.     }  
  6.       
  7.     public void registered(ISubscribe iSubscribe){  
  8.         list.add(iSubscribe);  
  9.     }  
  10.       
  11.     public void unregistered(ISubscribe iSubscribe){  
  12.         list.remove(iSubscribe);  
  13.     }  
  14.       
  15.     public abstract void sendNewsPaper();  
  16. }  

这里使用的是抽象类

下面是实现:

[java]  view plain copy
  1. public class PostOffice extends Publish{  
  2.   
  3.     @Override  
  4.     public void sendNewsPaper() {  
  5.         // TODO Auto-generated method stub  
  6.         Iterator iterator = list.iterator();  
  7.         while(iterator.hasNext()){  
  8.             ((ISubscribe) iterator.next()).getNewPaper();  
  9.         }  
  10.     }  
  11.       
  12. }  

测试:

[java]  view plain copy
  1. public static void main(String[] args) {  
  2.         // TODO Auto-generated method stub  
  3.         PostOffice postOffice = new PostOffice();  
  4.           
  5.         //得到个人用户  
  6.         PersonalSubscriber person = new PersonalSubscriber();  
  7.         person.setNewsPaperName("《南方周末》");  
  8.         //得到企业用户  
  9.         EnterpriseSubscriber enterprise = new EnterpriseSubscriber();  
  10.         enterprise.setNewsPaperName("《企业报》");  
  11.           
  12.         //注册观察者  
  13.         postOffice.registered(person);  
  14.         postOffice.registered(enterprise);  
  15.           
  16.         //发放报纸  
  17.         postOffice.sendNewsPaper();  
  18.     }  

测试结果:

[java]  view plain copy
  1. 我是个人用户,我得到了我的报纸:《南方周末》  
  2. 我是企业用户,我得到了我的报纸:《企业报》  
 

 

 

 在Android中,button.setOnclickListener()这个方式是比较常见的观察者模式:当然,众所周知,onClick是著名的回调方法,在这里不会研究回调,不用太在意。

看下代码:

[java]  view plain copy   
  1.         Button button1 = (Button)findViewById(R.id.button1);  
  2.         Button button2 = (Button)findViewById(R.id.button2);  
  3.         Button button3 = (Button)findViewById(R.id.button3);  
  4.         button1.setOnClickListener(this);  
  5.         button2.setOnClickListener(this);  
  6.         button3.setOnClickListener(this);  
  7.     }  
  8.   
  9.     @Override  
  10.     public void onClick(View v) {  
  11.         // TODO Auto-generated method stub  
  12.         switch(v.getId()) {  
  13.         case R.id.button1 :  
  14. //          do some thing         
  15.         case R.id.button2 :  
  16. //          do some thing  
  17.         case R.id.button3 :  
  18. //          do some thing  
  19.         }  
  20.     }  

先button.setOnclickListener()进行注册。相当于邮局中的postOffice.registered(person)。onclick响应事件相当于邮局中的

[java]  view plain copy
  1. public void sendNewsPaper() {  
  2.         for(ISubscribe subscribe : SubscribeList) {  
  3.             subscribe.getNewsPaper();  
  4.         }  
  5.     }  

这个中的subscribe.getNewsPaper()这个方法。View.onClickListener相当于邮局。View也就是button是我们的订阅者,也就相当于张三。我们也可以在getNewsPaper中加一些自己的switch判断。

       最后,如果我们的邮局要实现类似button这样的回调这么实现呢?

[java]  view plain copy
  1. ISubscribe isubscribe;  
  2.   
  3.     @Override  
  4.     public void getNewsPaper() {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("我是"+getName()+",我收到我订阅的"+getNewsPaperName());  
  7.         isubscribe.getNewsPaper();  
  8.     }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值