java设计模式案例详解:观察者模式
2016-06-13 12:00
471 查看
观察者模式的应用场景:
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
举个例子说明,这个例子讲述一个老大吩咐小弟做事的故事,只要老大一声令下小弟就开始工作,小弟成员可增减.根据模式定义,使用两个接口,多个实现
测试代码:
这样三个小弟就开始工作了.输出结果:
是不是清晰明了!
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(); } }
这样三个小弟就开始工作了.输出结果:
端茶 送水 做饭
是不是清晰明了!
相关文章推荐
- java并发编程(九)--并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- Spring aop配置
- Eclipse中将项目导出jar包,以及转化成exe的方法
- 【2】Java并发编程:volatile关键字解析
- Spring整合Hessian服务
- JDK环境变量中dt.jar、tools.jar等变量值的作用
- java并发编程(八)--synchronized的另个一重要作用:内存可见性
- result_type的几种类型
- Java内存管理机制-1
- Java全局搜索字符串
- spring自定义注解!
- Java统计单词个数
- java并发编程(七)--使用synchronized获取互斥锁的几点说明
- 银联在线Java接口开发
- JAVA-找不到或无法加载主类
- java设计模式-观察者模式
- 【JAVA笔记——术】GetResource 实现方式
- Java对象的序列化和反序列化
- RxJava操作符(04-过滤操作)
- java 计算引擎比较