java 观察者模式(大话设计模式)

观察者模式:又叫做发布-订阅模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。【继承+组合 】

在这里插入图片描述

/**
 * 主题或抽象通知者
 * 
 * @author administrator
 *
 */
public abstract class Subject {
    private List<Observer> observers = new ArrayList<Observer>();

    public void attach(Observer observer) {
	observers.add(observer);
    }

    public void detach(Observer observer) {
	observers.remove(observer);
    }

    public void notifyObserver() {
	for (Observer observer : observers) {
	    observer.update();
	}
    }
}
/**
 * 具体主题或通知者
 * 
 * @author administrator
 *
 */
public class ConcreteSubject extends Subject {
    private String subjectState;

    public String getSubjectState() {
	return subjectState;
    }

    public void setSubjectState(String subjectState) {
	this.subjectState = subjectState;
    }
}

/**
 * 抽象观察者
 * 
 * @author administrator
 *
 */
public abstract class Observer {

    public abstract void update();
}

/**
 * 具体观察者
 * 
 * @author administrator
 *
 */
public class ConcreteObserver extends Observer {

    private String name;
    private String observerState;
    private ConcreteSubject concreteSubject;

    public ConcreteObserver(ConcreteSubject concreteSubject, String name) {
	this.setName(name);
	this.setConcreteSubject(concreteSubject);
    }

    @Override
    public void update() {
	this.setObserverState(concreteSubject.getSubjectState());
	System.out.println("观察者" + this.getName() + "的新状态是"
		+ this.getObserverState());
    }

    public String getName() {
	return name;
    }

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

    public String getObserverState() {
	return observerState;
    }

    public void setObserverState(String observerState) {
	this.observerState = observerState;
    }

    public ConcreteSubject getConcreteSubject() {
	return concreteSubject;
    }

    public void setConcreteSubject(ConcreteSubject concreteSubject) {
	this.concreteSubject = concreteSubject;
    }

}
/**
 * 观察者模式客户端代码
 * 
 * @author administrator
 *
 */
public class ObserverClient {
    public static void main(String[] args) {
	ConcreteSubject concreteSubject = new ConcreteSubject();

	concreteSubject.attach(new ConcreteObserver(concreteSubject, "X"));
	concreteSubject.attach(new ConcreteObserver(concreteSubject, "Y"));
	concreteSubject.attach(new ConcreteObserver(concreteSubject, "Z"));

	concreteSubject.setSubjectState("ABC");
	concreteSubject.notifyObserver();

    }

}


案例 老板回来了

/**
 * 观察者模式(Observer)
 * 通知者接口
 */
public interface Subject {

    void attach(Observer observer);

    void detach(Observer observer);

    void notice();

    String getAction();

    void setAction(String action);

}
/**
 * 观察者模式(Observer)
 * 秘书类
 */
public class Secretary implements Subject {

    // 同事列表
    private List<Observer> observers = new ArrayList<>();
    private String action;

    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notice() {
        for (Observer o : observers) {
            o.update();
        }
    }

    @Override
    public String getAction() {
        return action;
    }

    @Override
    public void setAction(String action) {
        this.action = action;
    }

}
/**
 * 观察者模式(Observer)
 * 老板类
 */
public class Boss implements Subject {

    // 同事列表
    private List<Observer> observers = new ArrayList<>();
    private String action;

    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notice() {
        for (Observer o : observers) {
            o.update();
        }
    }

    @Override
    public String getAction() {
        return action;
    }

    @Override
    public void setAction(String action) {
        this.action = action;
    }

}

/**
 * 观察者模式(Observer)
 * 抽象观察者
 */
public abstract class Observer {

    protected String name;
    protected Subject subject;

    public Observer(String name, Subject subject) {
        this.name = name;
        this.subject = subject;
    }

    public abstract void update();

}
/**
 * 观察者模式(Observer)
 * 看股票的同事
 */
public class StockObserver extends Observer {

    public StockObserver(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void update() {
        System.out.println(subject.getAction() + name + " 关闭股票行情,继续工作!");
    }

}
/**
 * 观察者模式(Observer)
 * 看NBA的同事
 */
public class NBAObserver extends Observer {

    public NBAObserver(String name, Subject subject) {
        super(name, subject);
    }

    @Override
    public void update() {
        System.out.println(subject.getAction() + name + " 关闭NBA直播,继续工作!");
    }

}
/**
 * 观察者模式(Observer)
 * 客户端main方法
 */
public class Client {

    public static void main(String[] args) {
        // 老板
        Boss boss = new Boss();
        // 看股票的同事
        StockObserver worker1 = new StockObserver("舒克", boss);
        // 看NBA的同事
        NBAObserver worker2 = new NBAObserver("贝塔", boss);

        boss.attach(worker1);
        boss.attach(worker2);

        boss.detach(worker1);

        // 老板回来
        boss.setAction("我胡汉三回来啦!");

        // 发出通知
        boss.notice();
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值