zgq105 / blog

2 stars 0 forks source link

设计模式之观察者模式 #55

Open zgq105 opened 5 years ago

zgq105 commented 5 years ago

image

1. 什么是观察者模式?有什么作用?

观察者模式指在一对多的关系中,当一个对象的值发生改变时,会通知依赖它的所有对象,属于行为型设计模式。它的作用主要解决一个对象状态改变时,及时通知其他对象的问题。

2. 如何实现?

以微信公众号例子实现简单的观察者模式,具体代码如下: //创建主体角色:即被观察的对象

/**
 * Created by zgq on 2019/6/3 20:12
 * 主体对象:被观察的对象
 */
public class WxgzhSubject {

    private List<WxObserver> mWxObservers = new ArrayList<>();

    public boolean subscribe(WxObserver wxObserver) {
        return mWxObservers.add(wxObserver);
    }

    public boolean unsubscribe(WxObserver wxObserver) {
        return mWxObservers.remove(wxObserver);
    }

    /**
     * 通知所有观察者对象
     * @param content
     */
    public void notice(String content) {
        for (WxObserver wxObserver : mWxObservers) {
            wxObserver.notice(content);
        }
    }
}

//创建观察者角色-抽象接口

/**
 * Created by zgq on 2019/6/3 20:14
 */
public interface WxObserver {

    void notice(String content);
}

//创建具体的观察者实现类

/**
 * Created by zgq on 2019/6/3 20:15
 */
public class WxUser implements WxObserver {
    private String uid;
    private String name;

    public WxUser(String name) {
        this.name = name;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void notice(String  content) {
        System.out.println(this.name + "==="+content);
    }
}

//使用观察者模式

/**
 * Created by zgq on 2019/6/3 20:28
 */
public class ObserverModeTest {

    public static void test(){

        //创建主体对象
        WxgzhSubject wxgzhSubject=new WxgzhSubject();
        //创建观察者对象
        WxUser wxUser1=new WxUser("张三");
        WxUser wxUser2=new WxUser("李四");
        WxUser wxUser3=new WxUser("王五");
        //订阅-建立关联
        wxgzhSubject.subscribe(wxUser1);
        wxgzhSubject.subscribe(wxUser2);
        wxgzhSubject.subscribe(wxUser3);
        //通知
        wxgzhSubject.notice("公众号主页更新了");
        System.out.println("======");
        //取消订阅
        wxgzhSubject.unsubscribe(wxUser1);
        wxgzhSubject.notice("有新消息");

    }
}

3. JDK或Android的应用举例

在JDK中,java.util.Observable和java.util.Observer,分别代表观察者模式中的Subject和Observer。在Android中,View#OnClickListener和EventBus框架中使用了观察这模式。

4. 小结

观察者模式主要解决一对多的关系,当一个对象的状态发生改变时,如何通知关联的对象问题。在观察者模式中,需要了解主体对象(被观察的对象)和观察者对象;主体对象是指观察者需要观察的对象,主体提供订阅、取消订阅和通知等功能;而观察者对象指需要监听某个主体对象变更的对象。 优点:

缺点: