Java 观察者模式 简单例子

如果猫一叫,老鼠就跑,你会用什么模式。这里可以用观察者模式。

public interface ICat {

 public void addObserver(IMouse m);
 
 public void removeObserver(IMouse m);
 
 public void notifyObserver();
 
 //primary method (main biz process),it's cat, so main function is shout
 public void shout();
 
}

 

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

public class HelloKitty implements ICat{

 private List<IMouse> observers = new ArrayList<IMouse>();

 public void addObserver(IMouse m) {
  // TODO Auto-generated method stub
  observers.add(m);
 }

 public void removeObserver(IMouse m) {
  // TODO Auto-generated method stub
  observers.remove(m);
 }

 public void shout() {
  // TODO Auto-generated method stub
  System.out.println("Cat is shouting!");
  notifyObserver();
 }
 
 public void notifyObserver() {
  // TODO Auto-generated method stub
  for(IMouse m : observers){
   m.run();
  }
 }

 
}

 

public interface IMouse {

 public void run();
}

 

public class MickeyMouse implements IMouse{

 public void run() {
  // TODO Auto-generated method stub
  System.out.println("Kitty is coming, Let's horror run! ");
 }

}

 

public class Test {

 public static void main(String args[]){
  ICat cat = new HelloKitty();
  IMouse mouse = new MickeyMouse();
  cat.addObserver(mouse);
  cat.shout();
  
 }
}


 

 

如果要自己实现,代码可以简单的像上面这样写。

运行结果:

----------------------------------

Cat is shouting
Kitty is coming, Let's horror run!

 

但是Java给我们提供了Observer接口/ Observable实现类。

Observer接口里面就一个update方法。因为它是观察者,所以他只要接到通知道后,do biz就可以了,所以很简单。

Observable是个实现类,它做的事比较多,比如添加观察者,移去观察者,所以肯定要一个观察者集合,还有就是本身只否发生的change的成员变量设置,最主要的就是通知观察者这个方法了,具体可以自己看原码了。

下面看用Java给我们提供的方法再实现上面的业务,就更简单了。

import java.util.Observable;
public class HelloKitty extends Observable{
 
 public void shout(){
  System.out.println("Cat is shouting");
  super.setChanged();
  super.notifyObservers();
  
 }
 
}

 

import java.util.Observable;
import java.util.Observer;

public class MickeyMouse implements Observer{

//adds observers here, or you can remove this constructor, add observers in test.java

 public MickeyMouse(Observable o){
  o.addObserver(this);
 }
 public void update(Observable arg0, Object arg1) {
  // TODO Auto-generated method stub
  System.out.println("Kitty is coming, Let's horror run!");
 }

}

 

public class Test {

 public static void main(String [] args){
  HelloKitty cat = new HelloKitty();
  MickeyMouse mouse = new MickeyMouse(cat);
  cat.shout();
  
 }
}


运行结果和上面是一样的, 是不是方便很多。

还有像很多电子商务网站,在某个商品上会有,降价通知我的按钮,你觉得那是干什么的呢? 它也可用观察者模式实现哦。自己试试吧。

 

 


 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单Java 观察者模式例子如下: 首先,定义一个主题接口 Subject,包含注册观察者、移除观察者和通知观察者的方法: ``` public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } ``` 然后,定义一个观察者接口 Observer,包含更新方法: ``` public interface Observer { void update(String message); } ``` 接下来,实现具体的主题类 ConcreteSubject,继承自 Subject 接口,包含一个观察者列表和一个状态: ``` public class ConcreteSubject implements Subject { private List<Observer> observers; private String state; public ConcreteSubject() { observers = new ArrayList<>(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } public void setState(String state) { this.state = state; notifyObservers(); } } ``` 最后,实现具体的观察者类 ConcreteObserver,继承自 Observer 接口实现更新方法: ``` public class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " received message: " + message); } } ``` 使用示例: ``` ConcreteSubject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("Observer 1"); Observer observer2 = new ConcreteObserver("Observer 2"); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.setState("Hello World!"); subject.removeObserver(observer1); subject.setState("Goodbye World!"); ``` 输出结果: ``` Observer 1 received message: Hello World! Observer 2 received message: Hello World! Observer 2 received message: Goodbye World! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值