十三校园泡妞记

Hi,我是十三。一首华仔《暗里着迷》送给大家,怎样,是不是很符合气氛!

border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=29723022&auto=1&height=66">

心动的感觉

  这是设计模式系列的第 九 篇学习记录,什么,你 TM 在逗我,我要看的是妹子,你个标题党!大兄弟,你,你先别急,上吊也得喘口气,且听我娓娓道来…

  很多人都说大学一定要谈一场轰轰烈烈的恋爱,不然大学不算完整,十三在这之前可能对这些不太上心,觉得谈恋爱还不如打代码来的爽快实在,可十三最近却变了,他变得不再像以前那样那么勤快地敲代码了,不仅这样,他一下子觉得生活仿佛失去了色彩,饭也吃不香,觉也睡不香,大家可能会奇怪了,怎么回事,多上进的小伙子,怎么一下成那样了?

  十三说这些天他遇见了个妹子,第一眼看见便感很有眼缘,不免多看了几眼。此后几天,不管十三去哪都总能遇见她,总是那么的碰巧,犹如磁石那般有磁性,又像是被安排好一样,只待你走出场来。十三顿时觉得这感觉好奇妙,说不清道不明,每次看到她内心就好高兴可脸上却又一脸淡定,直到人家走远了又觉好失落,十三反问自己这是怎么了同时发现自己又好矛盾,然后就这样慢慢沦陷…

  晚上,十三决定和兄弟们谈谈心,”都别敲代码了,咱们来聊聊。“,十三对着哥几个说道,”哟,今儿咋怎么有兴致。“,十三接着便把进来情况说了出来,一听见是关于妹子,宿舍几个基佬立马就围了过来…

  “你是不是看上人家啦,你觉得她哪里好阿?”,一哥们问道。

  只见十三脑袋微微左倾,像是在回忆似的,“我也不知道怎么说,每次看到她就好开心,看到她在饭堂拿着一碗盛满的热汤,小心翼翼地放下后烫得立马甩手,还吐着小舌头,我就觉得她好可爱;一次在饭堂外的洗水池,我洗完手后不小心撞到一位同学,然后我和这位同学竟然异口同声地说了句不好意思,待我定睛一看,居然是她,那个时候,我看着她我整个人都愣在那里了,要是可以,我希望时间可以静止在那!”。

  ”完了,这家伙坠入爱河了!那等什么阿,追她!“。

  ”对,上啊,追她,哥几个帮你制定作战计划!“,其他哥们纷纷附和着。

  ”知己知彼,百战百胜,我们首先收买她闺蜜,让她做我们的线人给你制造机会。“。

  好主意,十三点点头暗暗想到。事实上,这个泡妞计划可以应用到设计模式中的观察者模式(画风突变,嘿嘿)。

观察者模式

  观察者模式又叫做发布-订阅模式,属于行为型设计模式中的一种,在我们平时的开发中经常用到。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

观察者模式中的角色及职责 :

  • Subject : 抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象.

  • ConcreteSubject : 具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知.

  • Observer : 抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己.

  • ConcreteObserver : 具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态.

  理论概念说了一大堆,咱们来点实在的 :

public interface Subject {

    public void attach(Observer observer);
    public void detach(Observer observer);
    public void notify(String message);

}

  这里我们先定义了一个接口,里面分别提供了 attach、detach、notify 三个方法,它便对应模式里抽象主题这个角色。我们接着往下看 :

public class GirlSubject implements Subject {

    private String name;
    public GirlSubject(String name) {
        this.name = name;
    }

    private List<Observer> boyList = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        boyList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        boyList.remove(observer);
    }

    @Override
    public void notify(String message) {
        for (Observer observer : boyList) {
            System.out.println(name + ":" + message);
            observer.update();
        }
    }

}

  接着我看到这里定义了个类,它实现了前面我们定义的抽象主题接口并实现了接口里的方法,那么它对应的角色便是具体主题这个角色了。在我们的泡妞计划中,这个类便是我们收买的线人了,我们还可以看到类里还有个容器,这个容器存储的便是十三这个观察者了,当然了,它可以有多个观察者,可这样一来,十三就会不高兴了,这意味着他有情敌。

public interface Observer {

    public void update();

}

  这里这个接口便是抽象观察者了,它里面提供了一个更新方法。然后我们再开看看具体实现它的具体观察者 :

public class BoyObserver implements Observer {

    private String name;

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

    @Override
    public void update() {
        System.out.println(name + ":" + "收到,等我抱得美人归,请你吃饭!");
    }

}

  同样具体观察者类实现了抽象观察者接口里的方法,在计划中这个类便是对应十三这个观察者了。好了,拟定好作战计划好,那么我们就要行动起来 :

 public class MainClass {
    public static void main(String[] args) {

        BoyObserver boy = new BoyObserver("十三");

        GirlSubject girl = new GirlSubject("LL室友");
        girl.attach(boy);
        girl.notify("LL出门啦,快去追她!");

    }
}
LL室友: LL出门啦,快去追她!
  十三: 收到,等我抱得美人归,请你吃饭!

  这样子,我们这个作战计划便用了观察者模式来手动实现了,手动?难道还有其他不用手动的方法吗?当然了…

Observable 和 Observer

  其实 Java JDK 下已经有提供了相关的类库帮助我们快速实现观察者模式,它们分别是 Observable 类 和 Observer 接口,下面我们来看看怎么样来应用 :

public class ConcreteSubject extends Observable{

    private String name;
    public ConcreteSubject(String name) {
        this.name = name;
    }

    public void getNotify(String message) {
        System.out.println(name +":" + "LL出门啦,快去追她!");
        setChanged();
        notifyObservers(message);
    }

}

  这里个类便是具体主题(具体被观察者),它继承了 JDK 包下的 Observable 这个类,在我们自己编写的 getNotify 方法中,当我们的被观察者状态发生改变后,我们直接调用继承的这个 Observable 这个类的 setChanged() 这个方法,它用来设置一个内部标志位注明状态发生了变化,而 notifyObservers() 方法会去调用一个列表中所有的 Observer 的 update() 方法,以通知它们被观察对象状态发生了变化。

public class ConcreteObserver implements Observer {

    private String name;
    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object object) {
        System.out.println(name + ":" + "收到,等我抱得美人归,请你吃饭!");
    }

}

  接着这个类也就是我们的具体观察者,它实现了 Observer 这个接口,我们实现了它的 update()方法,也就是当被观察者的状态发生改变时,观察者的状态也随之更新。最后我们来看看结果 :

public class MainClass {

    public static void main(String[] args) {

        ConcreteSubject subject = new ConcreteSubject("LL闺蜜");
        ConcreteObserver observer = new ConcreteObserver("十三");

        subject.addObserver(observer);

        subject.getNotify("LL出门啦,快去追她!");
    }
}
LL闺蜜: LL出门啦,快去追她!
  十三: 收到,等我抱得美人归,请你吃饭!

  通过实现 JDK 包下的提供的类库,我们同样也能实现观察者模式,而且相比与我们自己来手动实现,无疑使用官方提供的类库,我们可以更快地实现。但是十三还是推荐自己动手去实践下再用提供好的类库来实现,因为只有自己去动手操作,才能加深印象。

总结

那么到最后我们来简单总结下 :

使用场景 :
  当一个对象的改变需要同时改变其他对象的时候,并且它还不知道具体有多少对象待改变时,我们应该考虑观察者模式,此外,如 Android 中的广播也是相关的应用场景。

优点 :

  • 观察者和被观察者之间是抽象耦合并且容易扩展.

  • 双方的耦合都依赖于抽象,使得各自之间的变化不会影响到另一边.

最后来张观察者模式的合照 :

  好了,关于观察者模式的学习记录就到这里了,也希望各有情人终成眷属,最后十三想说的是,十三目前还是单身…绝没有任何秀恩爱之说,Ok,Goodbye!

  更好的阅读体验请移步到【十三的个人博客】:https://binshao.site/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值