设计模式之观察者

本文通过一个生动的例子介绍了观察者模式的应用。以唐僧师徒为背景,唐僧作为被观察者,三个徒弟作为观察者,当唐僧需要帮助时,徒弟们会做出反应。文章详细展示了如何使用Java实现这一模式。

最近在做一个监听,初步打算是用线程不断接收消息(感觉比较弱智的做法),但考虑效率和内存的问题,打算参考下android的onclick事件的实现,系统是使用观察者模式,所以参考了一些观察者模式的例子,有一个很不错,分享下

 

三个徒弟就唐僧

唐僧是目标

三个徒弟是观察者

 

public class Tangseng { 
 
    ArrayList<Person> lists; 
 
    public Tangseng() { 
        lists = new ArrayList<Person>(); 
    } 
 
    public void register(Person p) { 
        lists.add(p); 
    } 
 
    public void unRegister(Person p) { 
        lists.remove(p); 
    } 
 
    public ArrayList<String> help() { 
 
        ArrayList<String> arraylist = new ArrayList<String>(); 
 
        for (Person p : lists) { 
            arraylist.add(p.save()); 
        } 
 
        return arraylist; 
 
    } 
 

接下来就是三个徒弟类了,每个徒弟都有一个救师傅的方法,这是悟空类:

[java] public class Wukong implements Person { 
 
    @Override 
    public String getName() { 
 
        return "孙悟空"; 
    } 
 
    @Override 
    public String save() { 
 
        return this.getName() + "去救师傅了";  
    } 
 

八戒类:

[java] public class Bajie implements Person { 
 
    @Override 
    public String getName() { 
 
        return "八戒"; 
    } 
     
    @Override 
    public String save() { 
          
        return this.getName() + "去救师傅了";  
    } 
 

沙僧类:

[java] public class Shaseng implements Person { 
 
    @Override 
    public String getName() { 
 
        return "沙僧"; 
    } 
 
    @Override 
    public String save() { 
 
        return this.getName() + "去救师傅了"; 
    } 
 

师傅一喊救命,三个徒弟就会去救他,这里最后的实现类:

[java] public class XiyoujiActivity extends Activity { 
 
    private ListView listView; 
 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        listView = (ListView) findViewById(R.id.listView1); 
 
        Tangseng tangseng = new Tangseng(); 
        tangseng.register(new Wukong()); 
        tangseng.register(new Bajie()); 
        tangseng.register(new Shaseng()); 
 
        ArrayList<String> lists = tangseng.help(); 
 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
                android.R.layout.simple_list_item_1, lists); 
 
        listView.setAdapter(adapter); 
 
    } 

public class XiyoujiActivity extends Activity {

 private ListView listView;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  listView = (ListView) findViewById(R.id.listView1);

  Tangseng tangseng = new Tangseng();
  tangseng.register(new Wukong());
  tangseng.register(new Bajie());
  tangseng.register(new Shaseng());

  ArrayList<String> lists = tangseng.help();

  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, lists);

  listView.setAdapter(adapter);

 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值