观察者模式

观察者模式一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象状态发生变化会通知所有的观察者对象,使他们能够自己更新自己。

使用场景:

当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,应该考虑观察者模式。

有点:

一个抽象模型有两个方面,其中一方面依赖于另一个方面的时候,用观察者模式可以将这两者封装在独立的对象中使它们各自独立的改变和复用。
或者说,观察者模式所做的工作室接触耦合,让耦合的双方都依赖与抽象而不是依赖于具体,从而使得各自的变换都不会影响另一边的变化。

UML图:

这里写图片描述

实例代码:

package com.liran.main.DesignPattern.观察者模式;

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式<br><br/>
 * 观察者模式一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这
 * 个主题对象状态发生变化会通知所有的观察者对象,使他们能够自己更新自己。
 * Created by LiRan on 2016-02-20.
 */
public class Observer_pattern {

    public static void main(String[] args) {

        ContreteSubject Subject = new ContreteSubject();


        Subject.Attach(new ContreteObserver(Subject, "路人甲"));
        Subject.Attach(new ContreteObserver(Subject, "路人乙"));

        Subject.SubjectState = " 开始干活了 ";
        Subject.Notify();

        Subject.Attach(new ContreteObserver(Subject, "路人丙"));

        Subject.SubjectState = " 开始吃饭了 ";
        Subject.Notify();

    }


}

/**
 * 抽象主题类
 */
abstract class Subject {

    protected List<Observerr> observerList = new ArrayList<>();

    public void Attach(Observerr Observerr) {
        observerList.add(Observerr);
    }

    public void Detach(Observerr Observerr) {
        observerList.remove(Observerr);
    }

    public void Notify() {

        if (observerList.size() != 0 && observerList != null) {
            for (Observerr o : observerList) {
                o.Update();
            }
        }
    }


}

/**
 * 具体的主题
 */
class ContreteSubject extends Subject {

    public String SubjectState;

}

/**
 * 抽象观察者类
 */
abstract class Observerr {
    public abstract void Update();
}

/**
 * 具体的观察者类
 */
class ContreteObserver extends Observerr {

    private String name;
    private String observerState;
    private ContreteSubject subject;

    public ContreteObserver(ContreteSubject subject, String name) {
        this.subject = subject;
        this.name = name;
    }

    public ContreteSubject getSubject() {
        return subject;
    }

    public void setSubject(ContreteSubject subject) {
        this.subject = subject;
    }

    @Override
    public void Update() {
        observerState = this.subject.SubjectState;
        System.out.println("观察者: " + name + " 的新状态是:" + observerState);
    }

}

源码下载:Github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值