Java 在观察者设计模式中,主体和观察者是同一件事吗?
在观察者设计模式中,观察者观察主体和/或被观察者。观察者通过其更新得到通知Java 在观察者设计模式中,主体和观察者是同一件事吗?,java,class,design-patterns,observable,subject,Java,Class,Design Patterns,Observable,Subject,在观察者设计模式中,观察者观察主体和/或被观察者。观察者通过其更新得到通知 我很困惑这两件事(主体和可观察物)是否本质上是相同的?或者两者之间有细微的区别 主体和观察者是两个不同的实体(对象): 但是关于你的问题, 观察者观察主体或被观察者 主体的另一个名称是可观察的,所以它们是相同的 受试者保留一份观察者名单,所有观察者在受试者处登记。 所以,每当某个事件在主体上发生时,他都会通知所有的观察者 例如: 假设您有一个名为HTTPEngine的类,它处理所有与HTTP相关的内容(连接、数据检索等)
我很困惑这两件事(主体和可观察物)是否本质上是相同的?或者两者之间有细微的区别 主体和观察者是两个不同的实体(对象): 但是关于你的问题, 观察者观察主体或被观察者 主体的另一个名称是可观察的,所以它们是相同的 受试者保留一份观察者名单,所有观察者在受试者处登记。 所以,每当某个事件在主体上发生时,他都会通知所有的观察者 例如: 假设您有一个名为HTTPEngine的类,它处理所有与HTTP相关的内容(连接、数据检索等) 为了使HTTPEngine能够跨不同对象重用,它维护了一个列表,例如IHTTPObserver 因此,任何希望使用HTTPEngine的对象都会实现接口HTTPObserver,在HTTPEngine注册,然后收到事件通知 例: 因此,假设一个名为“client”的类想要使用HTTPENgine
class client: public HTTPObserver
{
void onEvent(){//got the event notification}
}
现在,HTTPENgine维护了一个观察者列表:
class HTTPEngine
{
private:
vector<IHTTPObserver*> clients;
public:
void register(IHTTPObserver* client){clients.push_back(client);}
void notifyclients(){
for(it=vector.begin();it!=Vector.end();it++)
(*it)->notifyEvent();}
};
class-HTTPEngine
{
私人:
向量客户端;
公众:
无效寄存器(IHTTPObserver*客户端){clients.push_back(客户端);}
void notifyclients(){
for(it=vector.begin();it!=vector.end();it++)
(*it)->notifyEvent();}
};
是的,两者都相同。
观察者可以观察到物体。
Subject保留一个观察者列表,以便它可以通知这些观察者任何状态更改
检查下面的Python代码,摘自
只要一个或多个观察者必须观察一个对象,就可以使用观察者设计模式 可观察的-接口或抽象类,用于定义将观察者附加到客户端和将其解除附加到客户端的操作。在GOF的书中,这个类/接口被称为主题 它们基本相同。 使用一对多关系时使用观察者设计模式 如果更新了主对象,则更新从属对象。Observer patter是行为设计patters的一个示例。它有三个 演员有这样的主类、从属超类和它的子类 查看以下观察者设计模式的UML图。
Circle
类是主类。它有一个
保持圆的所有观察者的特殊属性观察者。它可以连接(或重新连接,如果需要)观察员Observer
类是依赖项的超类。它是一个抽象类,为Circle
类提供常用方法AreaObserver
和PerimeterObserver
)是主类(Circle
)的从属类ObserverExample
来测试这个示例。它不是观察者设计模式的内容李>
Circle.java
public class Circle {
private List<Observer> observers;
private double radius;
public Circle() {
observers = new ArrayList<>();
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
notifyObservers();
}
/**
* attach an observer to the circle
*/
public void attach(Observer observer) {
observers.add(observer);
}
/**
* notify all observers on update
*/
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Circle circle;
public Observer(Circle circle) {
this.circle = circle;
}
public abstract void update();
}
public class AreaObserver extends Observer {
public AreaObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New area is: %f\n", Math.PI * circle.getRadius() * circle.getRadius());
}
}
public class PerimeterObserver extends Observer {
public PerimeterObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New Perimeter is: %f\n", 2 * Math.PI * circle.getRadius());
}
}
public class ObserverExample {
public static void main(String[] args) {
Circle circle = new Circle();
PerimeterObserver perimeterObserver = new PerimeterObserver(circle);
circle.attach(perimeterObserver);
AreaObserver areaObserver = new AreaObserver(circle);
circle.attach(areaObserver);
System.out.println("Set radius: 7.0");
System.out.println("---------------");
circle.setRadius(7.0);
System.out.println();
System.out.println("Set radius: 5.0");
System.out.println("---------------");
circle.setRadius(5.0);
}
}
AreaObserver.java
public class Circle {
private List<Observer> observers;
private double radius;
public Circle() {
observers = new ArrayList<>();
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
notifyObservers();
}
/**
* attach an observer to the circle
*/
public void attach(Observer observer) {
observers.add(observer);
}
/**
* notify all observers on update
*/
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Circle circle;
public Observer(Circle circle) {
this.circle = circle;
}
public abstract void update();
}
public class AreaObserver extends Observer {
public AreaObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New area is: %f\n", Math.PI * circle.getRadius() * circle.getRadius());
}
}
public class PerimeterObserver extends Observer {
public PerimeterObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New Perimeter is: %f\n", 2 * Math.PI * circle.getRadius());
}
}
public class ObserverExample {
public static void main(String[] args) {
Circle circle = new Circle();
PerimeterObserver perimeterObserver = new PerimeterObserver(circle);
circle.attach(perimeterObserver);
AreaObserver areaObserver = new AreaObserver(circle);
circle.attach(areaObserver);
System.out.println("Set radius: 7.0");
System.out.println("---------------");
circle.setRadius(7.0);
System.out.println();
System.out.println("Set radius: 5.0");
System.out.println("---------------");
circle.setRadius(5.0);
}
}
PerimeterObserver.java
public class Circle {
private List<Observer> observers;
private double radius;
public Circle() {
observers = new ArrayList<>();
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
notifyObservers();
}
/**
* attach an observer to the circle
*/
public void attach(Observer observer) {
observers.add(observer);
}
/**
* notify all observers on update
*/
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Circle circle;
public Observer(Circle circle) {
this.circle = circle;
}
public abstract void update();
}
public class AreaObserver extends Observer {
public AreaObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New area is: %f\n", Math.PI * circle.getRadius() * circle.getRadius());
}
}
public class PerimeterObserver extends Observer {
public PerimeterObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New Perimeter is: %f\n", 2 * Math.PI * circle.getRadius());
}
}
public class ObserverExample {
public static void main(String[] args) {
Circle circle = new Circle();
PerimeterObserver perimeterObserver = new PerimeterObserver(circle);
circle.attach(perimeterObserver);
AreaObserver areaObserver = new AreaObserver(circle);
circle.attach(areaObserver);
System.out.println("Set radius: 7.0");
System.out.println("---------------");
circle.setRadius(7.0);
System.out.println();
System.out.println("Set radius: 5.0");
System.out.println("---------------");
circle.setRadius(5.0);
}
}
ObserverExample.java
public class Circle {
private List<Observer> observers;
private double radius;
public Circle() {
observers = new ArrayList<>();
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
notifyObservers();
}
/**
* attach an observer to the circle
*/
public void attach(Observer observer) {
observers.add(observer);
}
/**
* notify all observers on update
*/
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Circle circle;
public Observer(Circle circle) {
this.circle = circle;
}
public abstract void update();
}
public class AreaObserver extends Observer {
public AreaObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New area is: %f\n", Math.PI * circle.getRadius() * circle.getRadius());
}
}
public class PerimeterObserver extends Observer {
public PerimeterObserver(Circle circle) {
super(circle);
}
@Override
public void update() {
System.out.printf("New Perimeter is: %f\n", 2 * Math.PI * circle.getRadius());
}
}
public class ObserverExample {
public static void main(String[] args) {
Circle circle = new Circle();
PerimeterObserver perimeterObserver = new PerimeterObserver(circle);
circle.attach(perimeterObserver);
AreaObserver areaObserver = new AreaObserver(circle);
circle.attach(areaObserver);
System.out.println("Set radius: 7.0");
System.out.println("---------------");
circle.setRadius(7.0);
System.out.println();
System.out.println("Set radius: 5.0");
System.out.println("---------------");
circle.setRadius(5.0);
}
}
输出:
Set radius: 7.0
---------------
New Perimeter is: 43.982297
New area is: 153.938040
Set radius: 5.0
---------------
New Perimeter is: 31.415927
New area is: 78.539816
根据输出,在更新主类时,似乎所有观察者都被更新了 我现在更困惑了,因为我现在有两个不同的答案:D@HarisGhauri,我猜巴萨夫想说的是:主体和观察者是不同的,但你的问题是:主体和可观察者是否相同。