设计模式-行为型-观察者模式

161 阅读1分钟

简介

观察者模式是行为型的一种,主要应用在对象存在一对多且存在依赖的场景。在观察者模式中,有观察者何被管擦在两种对象,当被观察者发生变化时,会自动通知其关心的观察者。在日常生活中,观察者也很常见,比如苹果新发布了一款手机,但没有现货,京东上会有个到货通知,若你点击了,当有现货时,你就会收到通知。接下来就以手机的到货通知为例写实现Demo:

Demo示例

1.首先定义消费者接口,其角色是观察者,然后一个NormalComsumer和Huangniu实现它:

public interface Consumer {
    void buy();
    void handle(Object msg);
}
public class NormalConsumer implements Consumer{

    private String name;

    public NormalConsumer(String name) {
        this.name = name;
    }

    public NormalConsumer(){}

    public void buy() {
        System.out.println("I pay for this phone.");
    }

    @Override
    public void handle(Object msg) {
        System.out.println(name + " received msg " + msg + ", I will buy");
        buy();
    }
}
public class Huangniu implements Consumer{
    private String name;

    public Huangniu(String name) {
        this.name = name;
    }

    public Huangniu(){}

    public void buy() {
        System.out.println("I pay for this phone.");
    }

    @Override
    public void handle(Object msg) {
        System.out.println(name + " received msg " + msg + ", I will buy");
        buy();
    }
}

2.定义手机类,其角色是被观察者:

import java.util.ArrayList;
import java.util.List;

public class Phone {

    private List<Consumer> follows = new ArrayList<>();

    public void addFollow(Consumer consumer) {
        follows.add(consumer);
    }

    public void removeConsumer(Consumer consumer) {
        follows.remove(consumer);
    }

    public void notify(Object msg) {
        for (Consumer follow : follows) {
            follow.handle(msg);
        }
    }
}

3.客户端调用:

public class Test {
    public static void main(String[] args) {
        Consumer mike = new NormalConsumer("mike");
        Consumer james = new Huangniu("james");

        Phone phone = new Phone();
        phone.addFollow(mike);
        phone.addFollow(james);

        phone.notify("Iphone15 Pro sale");
        /**
         * mike received msg Iphone15 Pro sale, I will buy
         * I pay for this phone.
         * james received msg Iphone15 Pro sale, I will buy
         * I pay for this phone.
         */
    }
}