现在的位置: 首页 > 综合 > 正文

观察者模式

2018年02月03日 ⁄ 综合 ⁄ 共 1857字 ⁄ 字号 评论关闭

各种模式不是一种新技术而是前辈中总结出解决各种问题的方式,观察者模式比较适合与当一个类发生变化的时候,有很多的类就做出相应变化。在这种类型下比较适合使用观察者模式:

在这里举一个例子,其中的角色有 老板 员工(简单期间只员工只有司机,秘书)当老板要出去开会的时候给秘书司机发送信息,之后秘书会准备相关资料而司机就是开车,具体代码如下:

1、老板的抽象:

/**
 *
 */
package com.baoss;

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

/**
 *@author WHD
 *2014-10-24
 */
/* *
 * 被观察这里要记录有哪些观察者注册了,而且还可以进行观察者的注册,观察者的删除
 *
 */
public interface Boss {
    //保存观察者
List<Staff> list= new ArrayList<Staff>();
    //添加观察者
public void addStaff(Staff staff);
    //删除观察者
public void removeStaff(Staff staff);
    //通知观察者
public void notice(String str);

}

2、具体老板(你的老板)

/**
 *
 */
package com.baoss;

/**
 *@author WHD
 *2014-10-24
 */
/*
 *被观察者的实现,这里就是我们的具体老板,实现了注册,删除以及保存注册者的方法
 */
public class BossImp implements Boss{

    @Override
    public void addStaff(Staff staff) {
        list.add(staff);
    }

    @Override
    public void removeStaff(Staff staff) {
     list.remove(staff);
    }

    @Override
    public void notice(String str) {
        // 通过遍历获取所有注册过的观察者
        for(Staff staff:list){
            staff.update(str);
        }
    }
}

3、员工抽象

/**
 *
 */
package com.baoss;

/**
 *@author WHD
 *2014-10-24
 */
public interface Staff {
    //被观察者发送消息的时候调用发送通知
public void update(String str);
}

4、秘书具体员工 (观察者)

/**
 *
 */
package com.baoss;

/**
 *@author WHD
 *2014-10-24
 */
/*
 * 秘书是一个具体的员工,也就是一个老板的观察者
 */
public class Secretary implements Staff{

    @Override
    public void update(String str) {
        doSome(str);
    }
private void doSome(String str){
    System.out.println("秘书"+str);
}
}

5、司机具体员工(观察者)

package com.baoss;

/**
 *@author WHD
 *2014-10-24
 */
public class Driver implements Staff {

    @Override
    public void update(String str) {
        doSome(str);
    }
private void doSome(String str){
    System.out.println("司机"+str);
}
}

6、测试类

/**
 *
 */
package com.baoss;

/**
 *@author WHD
 *2014-10-24
 */
// 测试类
public class Test {
public static void main(String[]args){
    //获取主体对象
    Boss boss= new BossImp();
    //观察者
    Staff sec=new Secretary();
    Staff dri= new Driver();
    //注册
    boss.addStaff(sec);
    boss.addStaff(dri);
    //向注册过的观察者发送信息
    boss.notice("我要出去");
}
}

抱歉!评论已关闭.