Android[高級教程] 設計模式之五 觀察者模式

今天我們來介紹一下觀察者模式,觀察者模式需要有目標對象,有觀察對象。

目標對象的改變會通知觀察對象也做出相應的變化。

接上一回的話題《西遊記》,唐僧就是目標對象,他的三個徒弟就是保護他去西天取經的,所以他是三個徒弟的目標對象。那每一個徒弟就是觀察對象,如果唐僧被妖怪抓去的話,徒弟們是要去救他的,不然沒有唐僧,徒弟們去西天也是沒用的,呵呵,我們來看一下具體的代碼呢:

將唐僧設為目標者,將每個觀察者註冊給他,就是他如果出事的話,能通知到徒弟們去救他啊!

[java] 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; 
 
    } 
 

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() + "去救師傅瞭";  
    } 
 

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() + "去救師傅瞭";  
    } 
 

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() + "去救師傅瞭"; 
    } 
 

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);

 }
}好瞭,看一下圖吧

  

 

當然,我們也可以實現其他的方法,例如:唐僧說吃飯,那每個徒弟就吃飯,看一下改過的代碼呢

[java] Tangseng tangseng = new Tangseng(); 
        tangseng.register(new Wukong()); 
        tangseng.register(new Bajie()); 
        tangseng.register(new Shaseng()); 
 
        ArrayList<String> lists = tangseng.eat(); 
Tangseng tangseng = new Tangseng();
  tangseng.register(new Wukong());
  tangseng.register(new Bajie());
  tangseng.register(new Shaseng());

  ArrayList<String> lists = tangseng.eat();我們將唐僧的help改成eat方法

[java] public ArrayList<String> eat() { 
 
        arraylist = new ArrayList<String>(); 
 
        for (Person p : lists) { 
 
            arraylist.add(p.eat()); 
        } 
 
        return arraylist; 
 
    } 
public ArrayList<String> eat() {

  arraylist = new ArrayList<String>();

  for (Person p : lists) {

   arraylist.add(p.eat());
  }

  return arraylist;

 }然後每個徒弟實現瞭eat的方法,最後產生的效果如下:
  

好瞭,觀察者模式這裡就講完瞭,有問題歡迎大傢留言。
 
摘自 kangkangz4的專欄 

發佈留言