学习尚学堂设计模式总结:
帮助:
1,理解什么是面向对象分析和面向对象设计
2,观察者模式
3,学会使用配置文件动态加载类
4,单例模式的使用
OOA:
确认我们要实现的功能是什么。
OOD:
这个功能我们怎么去实现。
要求:
模拟下列情形
* 1,小孩在睡觉
* 2,醒来后要求不同的对象作出不同的反应
步骤:
我们把小孩设为观察,让它去观察对象,当它自己醒来后就要求不同的对象作出反应,就好像小孩的手上系了一根强绳在不同的对象上,让小孩自己去告诉这些对象,他已经醒来,并要求这些对象作出反应。这样有利于提高效率,其他对象可以做它自己想做的事,不用一直守候这个小孩。
下面是代码实现:
Test.java
package com.panlong.dp.observer; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; /** * 模拟下列情形 * 1,小孩在睡觉 * 2,醒来后要求不同的对象作出不同的反应 * @author pl * */ class Child implements Runnable{ private List<WakenUpListener> wakenUpListeners = new ArrayList<WakenUpListener>(); public void addWakenUpListener(WakenUpListener l){ wakenUpListeners.add(l); } public void wakenUp(){ for(Iterator<WakenUpListener> itor = wakenUpListeners.iterator();itor.hasNext();){ WakenUpListener wakenUpListener = itor.next(); wakenUpListener.ActionToWakenUp(new WakenUpEvent(System.currentTimeMillis(),"bed",this)); } } @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } wakenUp(); } } class WakenUpEvent{ private long time; private String loc; private Child source; public WakenUpEvent(long time,String loc,Child source) { this.time = time; this.loc = loc; this.source = source; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } public Child getSource() { return source; } public void setSource(Child source) { this.source = source; } } class Dad implements WakenUpListener{ public void ActionToWakenUp(WakenUpEvent w){ System.out.println("Feed child"); } } class GrandFather implements WakenUpListener{ public void ActionToWakenUp(WakenUpEvent w){ System.out.println("hug child"); } } class Dog implements WakenUpListener{ public void ActionToWakenUp(WakenUpEvent w) { System.out.println("wang wang ----"); } } interface WakenUpListener{ public void ActionToWakenUp(WakenUpEvent w); } public class Test { public static void main(String args[]){ Child c = new Child(); String[] observers = PropertyMgr.getProperty("observers").split(","); for(String observer : observers){ //System.out.println(observer); try { c.addWakenUpListener((WakenUpListener) Class.forName(observer).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } new Thread(c).start(); } } class PropertyMgr{ private static Properties props = new Properties(); //静态初始化只执行一次,提高效率 static{ try { props.load(Test.class.getClassLoader().getResourceAsStream("com/panlong/dp/observer/observer.properties")); } catch (IOException e) { e.printStackTrace(); } } public static String getProperty(String key){ return props.getProperty(key); } }
observer.properties,内容:
observers=com.panlong.dp.observer.Dad,com.panlong.dp.observer.GrandFather,com.panlong.dp.observer.Dog