「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
设计模式 -- 观察者模式
含义: 当一个对象的状态发生改变时,会通知给依赖它的其他对象。
就拿拍卖举例吧,拍卖有拍卖员和竞拍者,他们相互之间就是被观察者和观察者的关系。
1.首先设置一个发送者的接口,有权利对竞拍者进行注册或者移除,并且能够发送消息给竞拍者。
public interface Subject
{
//注册一个竞拍者
public void registerBidders(Observer observer);
//移除一个竞拍者
public void removeBidders(Observer observer);
//通知所有的竞拍者
public void notifyBidders();
}
2.设置观察者的接口,负责更新接收的信息。
public interface Observer
{
public void update(String msg);
}
3.拍卖者的实现类
public class Auctioneer implements Subject{
private List<Observer> bidders = new ArrayList<Observer>();
//竞拍物品的信息
private String auctionGood;
@Override
public void registerBidders(Observer observer)
{
bidders.add(observer);
}
@Override
public void removeBidders(Observer observer)
{
int index = bidders.indexOf(observer);
if (index >= 0)
{
bidders.remove(index);
}
}
@Override
public void notifyBidders()
{
for (Observer observer : bidders)
{
observer.update(auctionGood);
}
}
//拍卖者通知信息
public void setauctionGood(String auctionGood)
{
this.auctionGood = auctionGood;
notifyBidders();
}
}
4.两个竞拍者的实现类
public class Bidders1 implements Observer
{
private Subject subject;
public Bidders1(Subject subject)
{
this.subject = subject;
subject.registerBidders(this);
}
@Override
public void update(String msg)
{
System.out.println("收到拍卖者的消息" + msg);
}
}
public class Bidders2 implements Observer
{
private Subject subject;
public Bidders2(Subject subject)
{
this.subject = subject;
subject.registerBidders(this);
}
@Override
public void update(String msg)
{
System.out.println("收到拍卖者的消息" + msg);
}
}
可以看出:拍卖员中维护了竞拍者,当有新的拍卖消息时,通知所有的竞拍者。观察者模式是一个松耦合的模式,主体的实现不依赖与使用者,当增加新的使用者时,主体的代码不需要改变;使用者可以随意的处理自己的信息,与主体无关。
public class Test
{
public static void main(String[] args)
{
//模拟一个3D的服务号
Auctioneer auctioneer = new Auctioneer();
//客户1
Observer bidders1 = new Bidders1(auctioneer);
Observer bidders2 = new Bidders2(auctioneer);
auctioneer.setauctionGood("拍卖的物品是111");
auctioneer.setauctionGood("拍卖的物品是222");
}
}
优点: 1、观察者和被观察者是抽象耦合的,耦合性较低。
缺点: 1、如果有很多直接间接的观察者,被观察者将会花费较长的时间去通知观察者。 2、如果在观察者和观察目标之间有循环依赖的话,将可能耗费大量系统资源进行循环调用,从而导致OG。 3、观察者不了解被观察者的具体信息,只是被动的接受信息。