java设计模式案例详解:观察者模式

观察者模式的应用场景: 
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

举个例子说明,这个例子讲述一个老大吩咐小弟做事的故事,只要老大一声令下小弟就开始工作,小弟成员可增减.根据模式定义,使用两个接口,多个实现

package main.java.com.learn.observer;

/**
 * 干活接口,接到消息的类实现该接口干活,也就是观察者
 * @author garfield
 *
 */
public interface Worker {

     void doSomeThing();

}
package main.java.com.learn.observer;

/**
 * 发号施令者,也就是被观察者
 * Created by garfield on 2016/6/13.
 */
public interface Mandator {

    void addWorker(Worker worker);

    void removeWorker(Worker worker);

    void notifyWorker();
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Mandator;
import main.java.com.learn.observer.Worker;

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

/**
 * 实现发号施令,方法有添加和开除小弟,并通知小弟做事
 * Created by garfield on 2016/6/13.
 */
public class MandatorImpl implements Mandator {

    private List<Worker> workers = new ArrayList<>();
    @Override
    public void addWorker(Worker worker) {
        workers.add(worker);
    }

    @Override
    public void removeWorker(Worker worker) {
        workers.remove(worker);
    }

    @Override
    public void notifyWorker() {
        for (Worker worker : workers) {
            worker.doSomeThing();
        }
    }
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Worker;

/**
 * 实现工作接口,各个小弟工作内容不一样
 * Created by garfield on 2016/6/13.
 */
public class WorkImpl_1 implements Worker{
    @Override
    public void doSomeThing() {
        System.out.println("端茶");
    }
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Worker;

/**
 * 实现工作接口,各个小弟工作内容不一样
 * Created by garfield on 2016/6/13.
 */
public class WorkImpl_2 implements Worker{
    @Override
    public void doSomeThing() {
        System.out.println("送水");
    }
}
package main.java.com.learn.observer.impl;

import main.java.com.learn.observer.Worker;

/**
 * 实现工作接口,各个小弟工作内容不一样
 * Created by garfield on 2016/6/13.
 */
public class WorkImpl_3 implements Worker{
    @Override
    public void doSomeThing() {
        System.out.println("做饭");
    }
}

测试代码:

package main.java.com.learn.observer;

import main.java.com.learn.observer.impl.MandatorImpl;
import main.java.com.learn.observer.impl.WorkImpl_1;
import main.java.com.learn.observer.impl.WorkImpl_2;
import main.java.com.learn.observer.impl.WorkImpl_3;

/**
 * Created by garfield on 2016/6/13.
 */
public class ObserverTest {

    public static void main(String[] args){
        Mandator mandator = new MandatorImpl();

        Worker worker1 = new WorkImpl_1();
        Worker worker2 = new WorkImpl_2();
        Worker worker3 = new WorkImpl_3();

        mandator.addWorker(worker1);
        mandator.addWorker(worker2);
        mandator.addWorker(worker3);

        mandator.notifyWorker();

    }
}

这样三个小弟就开始工作了.输出结果:

端茶
送水
做饭

  是不是清晰明了!

时间: 2024-10-11 04:25:58

java设计模式案例详解:观察者模式的相关文章

Java设计模式图文详解

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

【设计模式】设计模式原则详解

我们在应用程序开发中,一般要求尽量两做到可维护性和可复用性.       应用程序的复用可以提高应用程序的开发效率和质量,节约开发成本,恰当的复用还可以改善系统的可维护性.而在面向对象的设计里面,可维护性复用都是以面向对象设计原则为基础的,这些设计原则首先都是复用的原则,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性. 面向对象设计原则和设计模式也是对系统进行合理重构的指导方针. 常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充. 1.单一职责

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

设计模式原则详解

我们在应用程序开发中,一般要求尽量两做到可维护性和可复用性.       应用程序的复用可以提高应用程序的开发效率和质量,节约开发成本,恰当的复用还可以改善系统的可维护性.而在面向对象的设计里面,可维护性复用都是以面向对象设计原则为基础的,这些设计原则首先都是复用的原则,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性. 面向对象设计原则和设计模式也是对系统进行合理重构的指导方针. 常用的面向对象设计原则包括7个,这些原则并不是孤立存在的,它们相互依赖,相互补充. 1.单一职责

Java多线程编程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

Java Enum用法详解

Java Enum用法详解 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. enum Signal { GREEN, YE

java移位运算符详解[转]

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则 按

java内存泄露详解

很多人有疑问,java有很好的垃圾回收机制,怎么会有内存泄露?其实是有的,那么何为内存泄露?在Java中所谓内存泄露就是指在程序运行的过程中产生了一些对象,当不需要这些对象时,他们却没有被垃圾回收掉,而且程序运行中很难发现这个对象,它始终占据着内存却没有发挥作用. 我举这样一个例子,在现实开发中我们需要自定义一个先进后出的栈集合,代码如下: 这个代码看起来和运行起来都没问题,但是,这里有个很隐晦的问题,就是在pop()方法里面,我们首先找到集合最后一个元素的下标,然后按照下标从集合中取出,但是这