设计模式——观察者模式

场景引入:

想象这样一个场景:你在生活中有很多的朋友,相对于其他人而言,朋友和你很强的联系的。所以,你在生活中遇到了事情,你会去告诉你的朋友。(当然那种说自己很坚强,自己默默承认的人,我就不多说了)。但是在生活中,即便是再怎么要好的朋友,他都不可能一直等着你通知他消息,因为别人也是要生活的。所以,当你自己发生了事情,应该是你来通知你的朋友。即,你有一个通知的方法sendMessage()。这样,你自己就必须要有一个朋友的列表List<Friends>。再想象一下,生活多变,一个人的朋友不会一直不变。所以,为了生活过的去,你肯定有自己的一个方法去增加addFriends()或者减少removeFriends()朋友。然后你的朋友作为你的观察者,应该对于你的消息,有回应,即观察者有一个响应方法response()。在这种情形下,朋友就是观察者。观察者模式的重点就是当一个对象状态改变时,已经登记的其他对象能够观察到这一改变。在例子中体现出来就是:当你发生了事情,你认定的朋友可以收到你的通知。

模式关键点

  1. 改变的对象有一个观察者列表;
  2. 对象有通知观察者的方法;
  3. 观察者有反馈方法。如果观察者没有反馈,那就没有必要通知了。就好像你把别人当朋友,别人不把你当朋友,那就没有必要。所以,有反馈才是观察者模式的重点,不然不用设计这个模式。
  4. 增加观察者和删除观察者以及观察者的回应都不是必须的。一个对象可以只有一个观察者,这时候就不要增加观察者方法,一个对象的观察者是固定的,就不要删除观察者的方法。

代码实现

Notifier.class

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

public abstract class Notifier {
    // 一个人的朋友列表
    protected List<Friends> list = new ArrayList<Friends>();
	//增加朋友
    public void addFriends(Friends friend){
        list.add(friend);
    }
	//删除朋友
    public void removeFriends(Friends friend){
        list.remove(friend);
    }
	//遇上事了,通知朋友
    public void sendMessage(){
        for(Friends friend:list){
            friend.response();
        }
    }

}

You.class

public class You extends Notifier{
    //定制你自己,
    //假如你想把通知方法改成不同,就可以把Notifier中的SendMessage改成抽象的
    //然后实现
    //本处为了方便,全部写在抽象类Notifier类中了
}

interface Friends

public interface Friends {
	//朋友的响应办法
    public void response();
}

Roommates.class

public class Roommates implements Friends{

    public void response() {
        System.out.println("惆怅什么,没有什么事情是一把游戏不能解决的");
    }
}

Parents.class

public class Parents implements Friends{

    public void response() {
        System.out.println("孩子别急,你还年轻");
    }
}

Test.class

public class Test {
    public static void main(String[] args) {
        Notifier you = new You();
        you.addFriends(new Parents());
        you.addFriends(new Roommates());
        you.sendMessage();
        // 下面是验证两个不同的对象的list列表是否会重在一起
        Notifier you2 = new You();
        you2.addFriends(new Parents());
        you2.sendMessage();
    }
}

写在最后

以上只是一种观察者模式的简单实现。其实SendMesage()方法还可以写的更加广泛,比如抽象出一个事件类Events,描述你发生的消息。就比你你有好像还有坏消息一样,这样观察者就可以根据你的事件情况进行处理等等。重要的理解观察者模式的思想。看懂前面就行

Events.class

import java.util.Date;

public class Events {
    String s;
    Date date;

    public Events(String s, Date date) {
        this.s = s;
        this.date = date;
    }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

Notifier.class

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

public abstract class Notifier {
    // 一个人的朋友列表
    protected List<Friends> list = new ArrayList<Friends>();

    public void addFriends(Friends friend){
        list.add(friend);
    }

    public void removeFriends(Friends friend){
        list.remove(friend);
    }

    public void sendMessage(Events event){
        for(Friends friend:list){
            friend.response(event);
        }
    }

}

You.class

public class You extends Notifier{
    //定制你自己,
    //假如你想把通知方法改成不同,就可以把Notifier中的SendMessage改成抽象的
    //然后实现
    //本处为了方便,全部写在抽象类Notifier类中了
}

interface Friends

public interface Friends {
    public void response(Events events);
}

Roommates.class

public class Roommates implements Friends{

    public void response(Events events) {
        System.out.println(events.getDate()+":"+events.getS());
        System.out.println("惆怅什么,没有什么事情是一把游戏不能解决的");
    }
}

Parents.class

public class Parents implements Friends{

    public void response(Events events) {
        System.out.println(events.getDate()+":"+events.getS());
        System.out.println("孩子别急,你还年轻");
    }
}

Test.class

import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Notifier you = new You();
        you.addFriends(new Parents());
        you.addFriends(new Roommates());
        you.sendMessage(new Events("good message",new Date()));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值