1.概念
观察者模式类似于订阅一样,只要订阅了就能收到目标的变化通知。
2.go
package alian
import "fmt"
type Observer interface {
update()
}
type Subject struct {
observers []*Observer
status int
}
func (this * Subject)registry (observer *Observer){
this.observers = append(this.observers , observer)
}
func (this * Subject)unRegistry (observer *Observer){
for i := range this.observers{
if this.observers[i] == observer{
this.observers = append(this.observers[:i] , this.observers[i+1 :]...)
return
}
}
}
func (this *Subject) notifyALL(){
for i := range this.observers{
(*this.observers[i]).update()
}
}
type BinaryObserver struct {
subject *Subject
}
func (this * BinaryObserver) update(){
fmt.Println(fmt.Sprintf("%b" , this.subject.status))
}
type OctalObserver struct {
subject *Subject
}
func (this * OctalObserver) update(){
fmt.Println(fmt.Sprintf("%o" , this.subject.status))
}
package alian
import (
"fmt"
"testing"
)
func Test(t *testing.T) {
s := &Subject{[]*Observer{} , 10}
var binary , octal Observer
binary = &BinaryObserver{s}
octal = &OctalObserver{s}
s.registry(&binary)
s.registry(&octal)
fmt.Println("test1")
s.notifyALL()
fmt.Println("test2")
s.unRegistry(&binary)
s.notifyALL()
}
3.Java
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-03-29 22:53
**/
package alian.observer;
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
public void attach(Observer observer){
observers.add(observer);
}
public void unAttach(Observer observer){
observers.remove(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
public List<Observer> getObservers() {
return observers;
}
public void setObservers(List<Observer> observers) {
this.observers = observers;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-03-29 22:59
**/
package alian.observer;
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String: "
+ Integer.toBinaryString( subject.getState() ) );
}
}
package alian.observer;
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-03-29 23:24
**/
package alian.observer;
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: "
+ Integer.toOctalString( subject.getState() ) );
}
}
/**
* @program: demo
* @author: alian
* @description:
* @create: 2023-03-29 23:25
**/
package alian.observer;
public class Main {
public static void main(String[] args) {
Subject s = new Subject();
s.setState(10);
new BinaryObserver(s);
new OctalObserver(s);
s.notifyAllObservers();
}
}