观察者模式

来源:互联网 发布:淘宝c店变成企业店铺 编辑:程序博客网 时间:2024/06/09 17:33

1、新建观察者接口Observer

public interface Observer {    void update(String msg);}

 

2、新建被观察者接口Subject

public interface Subject {    void attact(Observer observer);//观察者订阅    void detact(Observer observer);//解除订阅    void notify(String msg);//被观察者发布消息}

3、新建员工类实现观察者接口

public class Employee implements Observer{    private String username;    public Employee(String username) {        this.username = username;    }    @Override    public void update(String msg) {        Log.w("msg",username+"  收到老板的信息:"+msg);    }}

4、新建老板类实现被观察者接口

public class Boss implements Subject{    private List<Observer>observers;    public Boss() {        observers=new ArrayList<>();    }        //订阅消息    @Override    public void attact(Observer observer) {        observers.add(observer);    }    //解除订阅    @Override    public void detact(Observer observer) {        for (int i=0;i<observers.size();i++){            if (observer.equals(observers.get(i)))            observers.remove(i);        }    }    //发布消息    @Override    public void notify(String msg) {        for (int i=0;i<observers.size();i++){            observers.get(i).update(msg);        }    }}

5、在MainActivity中调用

public class MainActivity extends AppCompatActivity {    private Employee em_1,em_2,em_3;    private Boss boss;    private Button btn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn=(Button)findViewById(R.id.btn);                //实例化员工        em_1=new Employee("刘炜");        em_2=new Employee("王嘉翔");        em_3=new Employee("沈锐彬");                //实例化老板        boss=new Boss();                //员工订阅老板消息        boss.attact(em_1);        boss.attact(em_2);        boss.attact(em_3);                btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //老板发消息                boss.notify("明天加班");                Log.i("msg","--------------分割线-------------");                                //王嘉翔解除订阅                boss.detact(em_2);                //老板再发消息                boss.notify("后天放假");            }        });    }}

6、运行结果:



7、源码链接:

https://github.com/Hasagit/ObserverDemo.git