Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在观察者设计模式中,主体和观察者是同一件事吗?_Java_Class_Design Patterns_Observable_Subject - Fatal编程技术网

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,我猜巴萨夫想说的是:主体和观察者是不同的,但你的问题是:主体和可观察者是否相同。