JAVA设计模式之【观察者模式】

本文通过一个简单的例子介绍了观察者模式的基本原理和实现方式。通过猫叫引起狗和猪的反应来展示一个对象的状态变化如何通知到其他多个相关对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式    交通信号灯是汽车的观察目标,汽车是观察者    一个对象的状态或行为的变化将导致其他对象的状态或行为也发生变化    为了描述这种一对多或一对一的联动,观察者模式应运而生    在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者。一个观察目标可以对应多个观察者。    别名        发布与订阅模式        模型与视图模式        源监听模式        从属者模式    角色        Subject目标、主题、被观察对象            定义观察者集合            提供方法增加和删除观察者对象            定义通知方法notify            可以是接口、抽象类或具体类        ConcreteSubject具体目标            包含经常发生改变的数据            状态改变向观察者发出通知        Observer观察者            对观察目标的改变做出反应            声明更新数据的方法update        ConcreteObserver具体观察者            存储具体观察者的状态            实现update方法            调用目标类的attach方法,加入集合            或通过detach方法将自己从目标类的集合中删除

看例子
1.抽象观察目标

package Observer;

/**
 * Created by Jiqing on 2016/10/28.
 */
import java.util.*;

public abstract class MySubject
{
    protected ArrayList observers = new ArrayList();

    //注册方法
    public void attach(MyObserver observer)
    {
        observers.add(observer);
    }

    //注销方法
    public void detach(MyObserver observer)
    {
        observers.remove(observer);
    }

    public abstract void cry(); //抽象通知方法
}

2.具体观察目标,猫

package Observer;

/**
 * Created by Jiqing on 2016/10/28.
 */
public class CatSubject extends MySubject{
    public void cry() {
        System.out.println("猫叫!");
        System.out.println("----------------------");
        for(Object obj:observers) {
            ((MyObserver)obj).response();
        }
    }
}

3.抽象观察者

package Observer;

/**
 * Created by Jiqing on 2016/10/28.
 */
public interface MyObserver
{
    void response();  //抽象响应方法
}

4.具体观察者

package Observer;

/**
 * Created by Jiqing on 2016/10/28.
 */
public class DogObserver implements MyObserver{
    public void response() {
        System.out.println("狗跟着叫!");
    }
}
package Observer;

/**
 * Created by Jiqing on 2016/10/28.
 */
public class PigObserver implements MyObserver{
    public void response() {
        System.out.println("猪也哄哄乱叫!");
    }
}

5.调用过程

package Observer;

/**
 * Created by Jiqing on 2016/10/28.
 */
public class Client {
    public static void main(String a[])
    {
        MySubject subject=new CatSubject();

        MyObserver obs1,obs2;
        obs1=new DogObserver();
        obs2=new PigObserver();

        subject.attach(obs1);
        subject.attach(obs2);

        subject.cry();
    }
}

执行结果:

猫叫!
----------------------
狗跟着叫!
猪也哄哄乱叫!

点评:
猫叫带动狗叫和猪叫~
例子不在于多复杂,在于能把概念阐述清晰。

看关系图

422101-20161028233440437-806486270.png



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6009750.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值