文档章节

java-设计模式-观察者模式

f
 fan1fan
发布于 2018/11/02 11:52
字数 729
阅读 35
收藏 1

       观察者模式是开发中比较常见的一种模式、例如队列的应用。那么不通过引入队列、怎么在项目中使用观察者模式呢?本文将用生产中的一个需求简单讲解。

        需求与分析:用户下单之后记录日志并赠送优惠券、短信提醒。那我们可能的代码实现如下:

package com.leqidi.observer;

/**
 * 购物简单处理流程
 * @author fjx
 *
 */
public class TicketSeller {

    
    /**执行下单业务*/
    public void sell(){
        System.out.println("sell");
        log();
        coupon();
        sms();
    }
    
    /**执行日志业务*/
    public void log(){
        System.out.println("log");
    }
    
    /**执行优惠券业务*/
    public void coupon(){
        System.out.println("coupon");
    }
    
    /**执行短信业务*/
    public void sms(){
        System.out.println("sms");
    }
    
    public static void main(String[] args) {
        TicketSeller ts = new TicketSeller();
        ts.sell();
    }
}
好、我们已经开发完成、但这样代码耦合性太强、其实已经给后面版本迭代、需求变更加个了坑了。假设我们又要添加下单后对接第三方系统的需求、那只能继续在这上面的代码继续修改、这违背了软件开发的“开闭原则“。

--------------------------------------------------------------------------------我是分割线

好、引入设计者模式、那我们的代码可以怎么写呢?

先定义一个"主题”、也就是被监听着、熟悉队列的朋友应该很清楚这个概念

package com.leqidi.observer.design;

/**
 * 
 * @author fjx
 *
 */
public interface Subject {

    /**
     * 注册观察者
     * @param notification 观察者
     */
    public void addRegister(Notification notification);
    
    /**
     * 通知观察者
     */
    public void call();
}
再给个主题的实现类

package com.leqidi.observer.design.impl;

import java.util.LinkedList;
import java.util.List;

import com.leqidi.observer.design.Notification;
import com.leqidi.observer.design.Subject;

/**
 * 
 * @author fjx
 *
 */
public class SubjectImpl implements Subject {

    List<Notification> notifications = new LinkedList<>();
    
    public void addRegister(Notification notification) {
        // TODO Auto-generated method stub
        notifications.add(notification);
    }
    
    public void call(){
        for(Notification notification : notifications){
            notification.doNotify();
        }
    }

}
再来个“观察者“、观察我们上面定义的”主题"

package com.leqidi.observer.design;

/**
 * 
 * @author fjx
 *
 */
public interface Notification {

    /**
     * 监听
     */
    public void doNotify();
}
分别有对应的具体观察者实例

package com.leqidi.observer.design.impl;

import com.leqidi.observer.design.Notification;

/**
 * 
 * @author fjx
 *
 */
public class CouponNotification implements Notification {

    public void doNotify() {
        // TODO Auto-generated method stub
        System.out.println("coupon");
    }

}

package com.leqidi.observer.design.impl;

import com.leqidi.observer.design.Notification;

/**
 * 
 * @author fjx
 *
 */
public class SmsNotification implements Notification {

    public void doNotify() {
        // TODO Auto-generated method stub
        System.out.println("sms");
    }

}
架构完成、最后测试client

package com.leqidi.observer.design;

import com.leqidi.observer.design.impl.CouponNotification;
import com.leqidi.observer.design.impl.LogNotification;
import com.leqidi.observer.design.impl.SmsNotification;
import com.leqidi.observer.design.impl.SubjectImpl;

public class Client { 

    public void sell(){
        /**执行下单业务*/
        System.out.println("sell");
    }
    
    public static void main(String[] args) {
        
        /**基础关系构建、项目中通过spring*/
        Subject subject = new SubjectImpl();
        Notification cn = new CouponNotification();
        Notification ln = new LogNotification();
        Notification sn = new SmsNotification();
        subject.addRegister(sn);
        subject.addRegister(ln);
        subject.addRegister(cn);
        /***/
        
        Client client = new Client();
        client.sell();
        subject.call();
    }
}
显然、我们的代码变丰(fu)富(za)起来很多。但是对于后续的需求变更、我们可以做到开闭原则了、大有以不变应万变的风格。

代码这种东西、前人种树、后人乘凉。

本文个人愚见!

© 著作权归作者所有

上一篇: nginx配置
f
粉丝 4
博文 4
码字总数 1388
作品 0
广州
私信 提问
加载中

评论(0)

设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
349
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
274
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
363
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00-Java 面试准备

面试之前 面试前准备简历需要注意的几个方面: 写简历、改简历,这个一定要干的。简历有两个作用,一个是吸引别人,能让别人邀请你去面试,这是前提;另一个是引导面试的人,让面试的人问你所...

源程序
今天
54
0
OSChina 周二乱弹 —— 大王(@罗马的王)颜值制霸Osc社区

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :Lunik的单曲《Seeing You Soar》 I hope you’re smiling,When seeing me soar. #今日歌曲推荐# 《Seeing You Soar》- Lunik 手...

小小编辑
今天
83
0
wordcount代码

1.写出map类 public class WCMapper extends Mapper<LongWritable,Text,Text,LongWritable>{ @Override protected void map(LongWritable key,Text value,Context context)throws IOExcepti......

七宝1
今天
59
0
Spring Batch 小任务(Tasklet)步骤

Chunk-Oriented Processing不是处理 step 的唯一方法。 考虑下面的一个场景,如果你仅仅需要调用一个存储过程,你可以在 ItemReader 中实现这个调用,然后在存储过程完成调用后返回 null。这...

honeymoose
今天
67
0
Linux日志分析

1. Linux日志文件的类型 2. 系统服务日志 2.1 syslogd的简介 2.2 syslogd的配置和使用 2.3 日志的安全性设置 2.4 远程日志记录服务 3. 日志的轮替 3.1 logrotate简介 3.2 logrotate的配置 3....

JiaMing
昨天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部