什么是做学院网站,前端和网站部署做网站的,网页设计制作项目,wordpress自定义搜索界面1 请你介绍一下观察者模式
观察者模式#xff08;Observer Pattern#xff09;是一种设计模式#xff0c;它定义了对象之间的一对多依赖关系#xff0c;当一个对象#xff08;被观察者#xff09;的状态发生改变时#xff0c;所有依赖于它的对象#xff08;观察者Observer Pattern是一种设计模式它定义了对象之间的一对多依赖关系当一个对象被观察者的状态发生改变时所有依赖于它的对象观察者都会得到通知并自动更新。
这种模型主要由三个角色构成
观察者Observer接收并处理被观察者发出的通知。通常观察者需要定义一个更新函数用以在接收到通知时更新自己的状态。
被观察者Subject当其状态发生改变时它需要通知所有观察者。通常被观察者维护一个观察者列表并定义添加、删除和通知观察者的方法。
具体观察者Concrete Observer和具体被观察者Concrete Subject分别实现观察者和被观察者的接口完成具体的业务逻辑。
观察者模式的主要优点是可以在不改变被观察者和观察者的情况下实现两者之间的松耦合关系。当被观察者发生改变时所有观察者都会得到通知并更新非常适合处理一对多的关系。
典型的应用包括GUI事件模型、订阅发布模型等。
2 观察者模式有几种类型
观察者模式一般分为两大类拉模型和推模型。
拉模型观察者将被观察者对象拉入自己进行处理也就是说观察者在接收到被观察者的变更通知后需要主动调用获取所需信息。这种方式的优点是观察者可以根据需要决定是否调用提高了灵活性。但是如果被观察者的数据非常复杂每个观察者需要的数据又不同那么观察者在拉取数据的时候可能会感到困难。
推模型被观察者主动向观察者推送信息也就是说被观察者在状态变化后会把一些参数推送给观察者。这种方式的优点是观察者可以直接获取到更新的数据实现方式相对简洁但同时也失去了一些灵活性因为被观察者已经决定了要推送的数据观察者无法根据需要选择。
在真实的系统设计中这两种模型具有各自的应用场景可以根据实际需要选择使用
3 请用java写一个推模型观察者模式的例子
观察者模式是一种较为常用的设计模式它定义了对象之间的一对多依赖这样一来当一个对象改变状态时它的所有依赖者都会收到通知并自动更新。
下面的例子展示了一个基本的观察者模式的实现其中包含一个主题Subject两个观察者Observer和一个推送新闻的方法。主题变化时所有的观察者都会接收到通知。
首先定义一个 Observable 接口描绘被观察者的基本结构
import java.util.ArrayList;
import java.util.List;public class NewsAgency {private String news;private ListChannel channels new ArrayList();public void registerChannel(Channel channel) {channels.add(channel);}public void unRegisterChannel(Channel channel) {channels.remove(channel);}public void setNews(String news) {this.news news;for (Channel channel : channels) {channel.update(this.news);}}
}定义一个 Observer 接口代表观察者
public interface Channel {void update(Object o);
}最后创建两个具体的 Observer 实现
public class NewsChannel implements Channel {private String news;Overridepublic void update(Object news) {this.news (String) news;}
}测试代码
public class Main {public static void main(String[] args) {// 创建新闻机构NewsAgency observable new NewsAgency();// 创建新闻频道NewsChannel observer new NewsChannel();// 新闻频道订阅新闻机构observable.registerChannel(observer);// 新闻机构发布新闻observable.setNews(Hello, Observer Pattern!);// 新闻频道接收到新闻更新String news observer.getNews();System.out.println(news);}
}在以上示例中一旦 NewsAgency 设置新闻所有注册的频道都会接收新闻更新。如果你在 NewsAgency 中添加更多的频道它们也会在新消息可用时收到更新。
4 请用java观察者模式写一个订阅发布的例子
当然可以以下是一个使用Java观察者模式实现的订阅发布示例
首先我们创建一个主题Subject接口该接口包含了添加、删除观察者以及通知观察者的方法。
public interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers(String message);
}接下来我们实现该接口并为其添加一个消息列表记录待发送的消息。
public class Newsletter implements Subject {private ListObserver observers new ArrayList();private ListString messages new ArrayList();Overridepublic void attach(Observer observer) {observers.add(observer);}Overridepublic void detach(Observer observer) {observers.remove(observer);}Overridepublic void notifyObservers(String message) {messages.add(message);for (Observer observer : observers) {observer.update(messages);}messages.clear();}
}在这个实现中我们维护了一个观察者列表和一个消息列表。每次调用notifyObservers()方法时我们将新的消息添加到列表中然后遍历观察者列表并调用每个观察者的update()方法将消息列表作为参数传递给观察者。
最后我们定义观察者Observer接口并实现一个具体的观察者类它将收到来自主题的消息。
public interface Observer {void update(ListString messages);
}public class Subscriber implements Observer {private String name;public Subscriber(String name) {this.name name;}Overridepublic void update(ListString messages) {System.out.printf(%s received %d messages.\n, name, messages.size());for (String message : messages) {System.out.printf(%s received message: %s\n, name, message);}}
}在该实现中我们实现了Observer接口并重写了update()方法该方法将打印出我们接收到的所有消息。然后我们实现了一个具体的观察者类Subscriber它包含一个名称字段在构造函数中初始化该字段。
现在我们可以测试我们的代码创建一些订阅者并向他们发送一些消息
public static void main(String[] args) {Newsletter newsletter new Newsletter();Observer subscriber1 new Subscriber(John);Observer subscriber2 new Subscriber(Marry);newsletter.attach(subscriber1);newsletter.attach(subscriber2);newsletter.notifyObservers(Hello, subscribers!);newsletter.notifyObservers(How are you today?);newsletter.detach(subscriber1);newsletter.notifyObservers(Goodbye, subscribers!);
}在这个示例中我们创建了一个Newsletter对象作为主题并创建了两个Subscriber对象作为观察者。我们将这两个观察者添加到主题中并向他们发送一些消息。然后我们从主题中删除第一个观察者并再次向另一个观察者发送一条消息。
总之这个示例演示了如何使用Java观察者模式创建一个基本的订阅发布系统。我们创建一个主题对象来管理所有的观察者并允许观察者订阅或取消订阅主题的消息同时也能够将消息广播给所有的观察者。