设计模式学习笔记(34)——观察者模式实现

观察者模式
办公室里大家在做别的事情,老板突然来了,需要通风报信。
一、双向耦合的代码

package operation;
import java.util.ArrayList;
class Secretary{//前台秘书类
	private ArrayList<StockObserver>observers=new ArrayList<StockObserver>();
	private String action;
	public void Attach(StockObserver observer) {
		observers.add(observer);
	}
	public void Notify() {
		for(int i=0;i<observers.size();i++) {
			observers.get(i).Update();
		}
	}
	public String getAction() {
		return action;
	}
	public void setAction(String action) {
		this.action=action;
	}
}
class StockObserver{//看股票同事类
	private String name;
	private Secretary sub;
	public StockObserver(String name,Secretary sub) {
		this.name=name;
		this.sub=sub;
	}
	public void Update() {//得到前台通知
		System.out.println(sub.getAction()+name+"关闭股票行情,继续工作!");
	}
}
 
public  class Main{
	public static void main(String[] args){
	Secretary tongzhizhe=new Secretary();
	StockObserver tongshi1=new StockObserver("小王",tongzhizhe);
	StockObserver tongshi2=new StockObserver("小李",tongzhizhe);
	tongzhizhe.Attach(tongshi1);
	tongzhizhe.Attach(tongshi2);
	tongzhizhe.setAction("老板回来了");
	tongzhizhe.Notify();
	
	}
}

二、解耦代码
在这里插入图片描述

package operation;
import java.util.ArrayList;
abstract class Subject{
	abstract void Attach(Observer observer);
	abstract void Detach(Observer observer);
	abstract void Notify();
	String action;
	public String getAction() {
		return action;
	}
	public void setAction(String action) {
		this.action=action;
	}
}
class Boss extends Subject{
	private ArrayList<Observer>observers=new ArrayList<Observer>();
 

void Attach(Observer observer) {
	
	observers.add(observer);
}
 
void Detach(Observer observer) {

	observers.remove(observer);
}

void Notify() {

	for(int i=0;i<observers.size();i++) {
		observers.get(i).Update();
	}
}
	
}
class Secretary extends Subject{
	private ArrayList<Observer>observers=new ArrayList<Observer>();

void Attach(Observer observer) {

	observers.add(observer);
}

void Detach(Observer observer) {

	observers.remove(observer);
}

void Notify() {

	for(int i=0;i<observers.size();i++) {
		observers.get(i).Update();
	}
}
	
}
abstract class Observer{
	protected String name;
	protected Subject sub;
	public Observer(String name,Subject sub) {
		this.name=name;
		this.sub=sub;
	}
	public abstract void Update();
}
class StockObserver extends Observer{
	public StockObserver(String name,Subject sub) {
		super(name,sub);
	}
 
	public void Update() {

		System.out.println(sub.getAction()+name+"关闭股票行情,继续工作!");
	}
 
}
class NBAObserver extends Observer{
	public NBAObserver(String name,Subject sub) {
		super(name,sub);
	}
 
	public void Update() {

		System.out.println(sub.getAction()+name+"关闭NBA直播,继续工作!");
	}
 
}
public  class Main{
	public static void main(String[] args){
		Secretary tongzhizhe=new Secretary();
		StockObserver tongzhizhe1=new StockObserver("小李",tongzhizhe);
		NBAObserver tongzhizhe2=new NBAObserver("小张",tongzhizhe);
		tongzhizhe.Attach(tongzhizhe1);
		tongzhizhe.Attach(tongzhizhe2);
		tongzhizhe.setAction("老板回来了");
		tongzhizhe.Notify();
	}
}

三、观察者模式
在这里插入图片描述

package operation;
import java.util.ArrayList;
 
abstract class Subject{
	private ArrayList<Observer>observers=new ArrayList<Observer>();
	public void attach(Observer observer) {
		observers.add(observer);
	}
	public void detach(Observer onserver) {
		observers.remove(observer);
	}
	void Notify() {
		for(int i=0;i<observers.size();i++) {
			observers.get(i).update();
		}
	}
}
abstract class Observer{
	public abstract void update();
}
class ConcreteSubject extends Subject{
	private String subjectState;
 
	public String getSubjectState() {
		return subjectState;
	}
 
	public void setSubjectState(String subjectState) {
		this.subjectState = subjectState;
	}
	
}
class ConcreteObserver extends Observer{
 
	private String name;
	private String observerState;
	private ConcreteSubject subject;
	public ConcreteObserver(ConcreteSubject subject,String name) {
		this.name=name;
		this.subject=subject;
	}
	@Override
	public void update() {
		// TODO Auto-generated method stub
		observerState=subject.getSubjectState();
		System.out.println("观察者"+name+"的新状态是"+observerState);
	}
	
}
public  class Main{
	public static void main(String[] args){
		ConcreteSubject s=new ConcreteSubject();
		s.attach(new ConcreteObserver(s,"X"));
		s.attach(new ConcreteObserver(s,"Y"));
		s.attach(new ConcreteObserver(s,"Z"));
		s.setSubjectState("ABC");
		s.Notify();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值