观察者:使用在存在一对多的关系场景,一个对象改变了,它会通知所有的依赖者,进行某一些更改。
观察者模式最直观的例子就是,拍卖师和竞价者的一对多关系,这里拍卖师对多个竞价者,当竞价者给出最高价时,拍卖师就会通知所有的竞价者当前的价格
代码示例
1.创建一个”拍卖师“
/** * 拍卖师 */ public class Auction { //在场的所有竞价者 private List<Competitor> competitors = new ArrayList<>(); //当前最高价 private int price; public int getPrice() { return price; } public void setPrice(int price) { this.price = price; //在得知最高价的时候,马上通知所有的竞价者 notifyCompetitor(); } //添加竞价者 public void addCompetitor(Competitor competitor) { competitors.add(competitor); } //通知所有竞价者,当前的最高价 public void notifyCompetitor() { for (Competitor competitor : competitors) { competitor.getPrice(); } } }
2.创建一个竞价者接口(因为竞价者会有很多个,所以抽象出一个接口 )
/** * 抽象竞价者接口 */ public interface Competitor { void getPrice(); }
3.创建两个竞价人(Jack和Smith)
/** * 具体竞价者:Jack */ public class Jack implements Competitor{ //拍卖师 private Auction auction; public Jack(Auction auction) { this.auction = auction; //把当前竞价者记录下来 auction.addCompetitor(this); } @Override public void getPrice() { System.out.println("jack竞价人了解到当前的最高价为:" + auction.getPrice()); } }-------------------smith竞价人-----------
/** * 具体竞价者:Smith */ public class Smith implements Competitor{ //拍卖师 private Auction auction; public Smith(Auction auction) { this.auction = auction; //把当前竞价者记录下来 auction.addCompetitor(this); } @Override public void getPrice() { System.out.println("Smith竞价人了解到当前的最高价为:" + auction.getPrice()); } }
4.测试
public class Test { public static void main(String[] args) { //拍卖师 Auction auction = new Auction(); //两个竞价者 new Jack(auction); new Smith(auction); //假设拍卖师看到宝物的主人给出了最低价:100000,拍卖师立刻告知在场的所有竞价者 auction.setPrice(100000); } }输出:
jack竞价人了解到当前的最高价为:100000
Smith竞价人了解到当前的最高价为:100000
总结:以上就是当一个对象作出改变时(拍卖师设置新的价格),它会通知所有的依赖者进行某一些操作(竞价者获取当前最高价)