设计模式 -- 观察者模式

283 阅读2分钟

「这是我参与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、观察者不了解被观察者的具体信息,只是被动的接受信息。