观察者模式初探

一、背景

哎呀时间过得真快已经2020,但是依然是单身但是你并不想继续单身下去于是你就去到了啥百合网啥的。注册了一个账号,并且把你心中理想女友的要求,这时你不需要一直等着,只要百合网有符合你要求的女生他自然就会通知你。

二、百合网

这时百合网就可以看作一个主题,他提供了注册通知等方法。那百合网可以抽象为如下的接口

public interface MarriageAgency {
    /**
     * 注册
     * @param human
     */
    void register(Human human);

    /**
     * 取消通知
     * @param human
     */
    void cancel(Human human);

    /**
     * 有符合要求的将会通知对应的注册的人
     */
    void sendMessage();
}

百合网有这些女生的数据包含身高、体重、学历、职业等,当有一个新的女注册进来的说他需要找一个男朋友的时候,如果符合要求它就会发生消息通知你。那么百合网具体的实现如下:

public class BaiHe implements MarriageAgency {

    private float height;
    private float weight;
    private String educational;
    private String profession;
    private ArrayList<Human> peo;
    
    public BaiHe(){
        peo = new ArrayList<>();
    }
    
    @Override
    public void register(Human human) {
        peo.add(human);
    }

    @Override
    public void cancel(Human human) {
        if (peo.contains(human)){
            peo.remove(human);
        }
    }

    @Override
    public void sendMessage() {
        for (Human human : peo) {
            human.sendMessage(height,weight,educational,profession);
        }
    }
    
    public void girlRegister(float height,float weight,String educational,String profession){
        this.height = height;
        this.weight = weight;
        this.educational = educational;
        this.profession = profession;
        
        //通知
        sendMessage();
    }
}

这时可以把所有渴求对象的男士或者女士都可以抽象为Human接口,他们只需要接口到百合网的这个消息,然后自己去那个妹子联系,剩下你们懂的。

public interface Human {
    /**
     * 接受百合网的消息
     * @param height
     * @param weight
     * @param educational
     * @param profession
     */
    void sendMessage(float height,float weight,String educational,String profession);

    /**
     * 约会
     */
    void appointment();
}

程序员自然也是这其中之一,但是程序员在接受到消息的时候,也需要一个载体来显示消息,在这里载体的抽象就不展示了就是一个display方法。

public class Programmer implements Human, Phone {

    private float height;
    private float weight;
    private String educational;
    private String profession;
    private MarriageAgency marriageAgency;


    public Programmer(MarriageAgency people){
        this.marriageAgency = people;
        this.marriageAgency.register(this);
    }

    @Override
    public void display() {
        System.out.println("A girl height: "+ height + "," + "weight: "+ "," + "educational: "+ educational + "," + "profession: "+ profession );
    }

    @Override
    public void sendMessage(float height, float weight, String educational, String profession) {
        this.height = height;
        this.weight = weight;
        this.educational = educational;
        this.profession = profession;

        //收到百合网的消息
        display();
        //约会中
        appointment();
    }

    @Override
    public void appointment() {
        System.out.println("和女孩子约会中.....");
    }
}

就这样找到了一个女朋友,在你有女朋友之后你就取消了消息通知

    public static void main(String[] args) {
        //百合网
        BaiHe baiHe = new BaiHe();

        //你注册了
        Programmer programmer = new Programmer(baiHe);

        //第一个女孩注册
        baiHe.girlRegister(1.7f,50,"博士","老师");
        //第二个女孩注册
        baiHe.girlRegister(1.75f,50,"硕士","程序员");

        //你和前面女孩好了,你取消了消息通知
        programmer.cancel();

        //又有女孩注册了
        baiHe.girlRegister(1.72f,52,"本科","医生");
        baiHe.girlRegister(1.73f,51,"硕士","教师");

        //可是你再也收不消息

    }
   A girl height: 1.7,weight: ,educational: 博士,profession: 老师
  和女孩子约会中.....
  A girl height: 1.75,weight: ,educational: 硕士,profession: 程序员
  和女孩子约会中.....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值