Lying design pattern -Java implement (14) - observer mode

Observer mode, also known as publish - subscribe (Publish / Subscribe) model, defines dependent relationship of one to many observers have multiple objects simultaneously monitor a topic object. This theme object when the status changes, will notify all observer objects, enabling them to automatically update itself.
For example:
at work, if the boss is not, some people could relax, watch the news or look at the stock. This time need to have a personal moment to observe the movements of the old version, if the boss came back, inform you soon, so that we quickly get to work.

1. observer interface theme change is found, the method to be performed.

public interface IObserver {
	
	void goToWork();
	
}

2. The actual observers

//看新闻的同事
public class NewsObserver1 implements IObserver {

	private String name;
    public NewsObserver(String name) {
       this.name = name;
    }
    
    @Override
    public void goToWork() {
        System.out.println(name + "停止看新闻,开始工作。");
    }

}
//看体育赛事的同事
public class SportsObserver1 implements IObserver {

	private String name;
	
	public SportsObserver(String name) {
		this.name = name;
	}
	
	@Override
	public void goToWork() {
		System.out.println(name + "停止看体育赛事,开始工作。");
	}

}
// 看股票的同事
public class StockObserver1 implements IObserver {
    
    private String name;
    
    public StockObserver(String name) {
        this.name = name;
    }

    @Override
    public void goToWork() {
        System.out.println(name + "停止炒股,开始工作。");
    }
}

3. The theme of the interface, is responsible for adding, deleting observer, and send notifications

public interface ISubject {
	
	void addObserver(IObserver iObserver);
    void delObserver(IObserver iObserver);
    void bossReturn();
	
}

4. The theme of the implementation class

import java.util.ArrayList;
import java.util.List;
public class NotifySubject1 implements ISubject {

    List<IObserver> observers;
    
    @Override
    public void addObserver(IObserver iObserver) {
        if (observers == null) {
            observers = new ArrayList<>();
        }
        observers.add(iObserver);
    }

    @Override
    public void delObserver(IObserver iObserver) {
        if (observers == null || observers.isEmpty()) {
            return;
        }
        observers.remove(iObserver);
    }

    // 通知每一个加入过的观察者,去执行主题变更时的方法
    public void notifyObserver() {
        for (IObserver iObserver : observers) {
            iObserver.goToWork();
        }
    }

    @Override
    public void bossReturn() {
        System.out.println("boss回公司了,大家赶紧开始工作");
        notifyObserver();
    }
    
}

The main program code

//主程序代码
public class Test1 {
	
    public static void main(String[] args) {
    	
        IObserver xiaoMing = new NewsObserver1("小明");
        IObserver xiaoWang = new SportsObserver1("小王");
        IObserver xiaoLi = new StockObserver1("小李");
        
        ISubject boss = new NotifySubject1();
        boss.addObserver(xiaoMing);
        boss.addObserver(xiaoWang);
        boss.addObserver(xiaoLi);
        
        boss.bossReturn();  
            
        System.out.println("=== 这次忘记通知小王了 ===");        
        boss.delObserver(xiaoWang);
        boss.bossReturn();    
        System.out.println("=== 小王被老板逮到了 ===");      
        
    }
    
}

Results are as follows:
Here Insert Picture Description
the Java packages provided in java.util Observable classes and interfaces can also be implemented Observer observer mode.
Wherein the viewer class is implemented observed Observable class interface, when calling the setChanged () method, a change in the observer is represented, this time is called when the viewer notifyObservers () method invokes the interface in the Observer Update (Observable o, Object arg) method. If the called notifyObservers (Object arg) observer method, the required parameters can also pass through addObserver (Observer o), deleteObserver ( Observer o) method to add, delete viewer.
Adjustment of the code after the following:
1. The subject matter category to be observed

import java.util.Observable;
public class NotifySubject2 extends Observable {
	
    String message;    
    
    public NotifySubject2() {
        message = "你们玩吧,我帮你们观察boss";
        System.out.println("NotifySubject: " + message);
    }
    
    public void bossReturn(){
        message = "boss回公司了,大家赶紧开始工作";
        System.out.println("NotifySubject: " + message);
        setChanged();
        this.notifyObservers(message);
    }
    
}

2. observer class

import java.util.Observable;
import java.util.Observer;
//看新闻的同事
public class NewsObserver2 implements Observer {
	
	private String name;
	
	public NewsObserver2(String name) {
		this.name = name;
	}
	
	@Override
	public void update(Observable o, Object arg) {
		System.out.println(name + "收到消息:" + arg + "。 停止看新闻,开始工作。");
	}
	
}
import java.util.Observable;
import java.util.Observer;
//看体育赛事的同事
public class SportsObserver2 implements Observer {
	
	private String name;
	
	public SportsObserver2(String name) {
		this.name = name;
	}
	
	@Override
	public void update(Observable o, Object arg) {
		System.out.println(name + "收到消息:" + arg + "。 停止看体育赛事,开始工作。");
	}
	
}
import java.util.Observable;
import java.util.Observer;
//看股票的同事
public class StockObserver2 implements Observer {
	
	private String name;
	
	public StockObserver2(String name) {
		this.name = name;
	}
	
	@Override
	public void update(Observable o, Object arg) {
		System.out.println(name + "收到消息:" + arg + "。 停止炒股,开始工作。");
	}
	
}

3. The main program:

import java.util.Observer;
//主程序代码
public class Test2 {
	
    public static void main(String[] args) {
    	
        Observer xiaoMing = new NewsObserver2("小明");
        Observer xiaoWang = new SportsObserver2("小王");
        Observer xiaoLi = new StockObserver2("小李");
        
        NotifySubject2 boss = new NotifySubject2();
        boss.addObserver(xiaoLi);
        boss.addObserver(xiaoWang);
        boss.addObserver(xiaoMing);
        boss.bossReturn();
        
        System.out.println("=== 这次忘记通知小王了 ===");
        
        boss.deleteObserver(xiaoWang);;
        boss.bossReturn();
        
        System.out.println("=== 小王被老板逮到了 ===");
        
    }
    
}

Results are as follows:
Here Insert Picture Description
Specific Explanation Observer and Observable present at clickable

Published 80 original articles · won praise 59 · views 4353

Guess you like

Origin blog.csdn.net/qq_44458489/article/details/105069320