交通信号灯系统:路口中的交通信号灯会根据预先的设定,周期性的变化颜色(红灯、绿灯),当交通信号灯的颜色变化是,向路口中的交通参与者(车辆、行人)发出通知,交通参与者(车辆、行人)接收到通知时,采取相应的的行动(通过路口或等待)。
其相关的UML类图如下:
关键代码如下:
定义TrafficLightEvent类,在其中注册具体观察者的监听器,同时使事件发生。
package observerPatterns; import java.util.*; public class TrafficLightEvent { public static void main(String[] args) { TrafficLight light=new TrafficLight(); //事件源 信号灯 light.addTrafficListener(new Cars()); //注册监听器 车辆 light.addTrafficListener(new People()); //注册监听器 行人 light.changeColor("Red"); System.out.println("********************"); light.changeColor("Green"); } }
定义TrafficLight类,它保存了观察者的List,增加/删除观察者的方法,以及当交通灯颜色变化时的处理和通知方法 。
package observerPatterns; import java.util.*; /* TrafficLight */ public class TrafficLight { private List<Traffic> listener; //监听器容器 public TrafficLight() { listener=new ArrayList<Traffic>(); } /* 事件源绑定监听器 */ public void addTrafficListener(Traffic cars) { listener.add(cars); }
public void removeTrafficListener(Traffic cars) {
listener.remove(cars);
} /* 事件触发器 */ public void changeColor(String color) { System.out.println("Traffic Light Color: "+ color); LightColor event=new LightColor(this, color); notifies(event); //通知注册在该事件源上的所有监听器 } /* 当事件发生时,调用事件处理方法 */ protected void notifies(LightColor e) { Traffic traffic = null; Iterator<Traffic> iterator=listener.iterator(); while(iterator.hasNext()) { traffic = iterator.next(); traffic.see(e); } } }
定义具体观察者 Cars类实现抽象观察者 Traffic 接口的 see方法。
package observerPatterns; import java.util.*; /* 抽象观察者类*/ public interface Traffic extends EventListener { public void see(LightColor e); }
package observerPatterns; /* 具体观察者类 车辆 */ public class Cars implements Traffic { public void see(LightColor e) { if("Red".equals(e.getColor())) { System.out.println("***Cars Stop"); } else { System.out.println("***Cars Pass"); } } }
观察者模式在这个应用场景的适用性:本场景对象间存在一对多关系,即:一个交通灯对应多个交通参与者,当交通灯颜色变化会影响交通参与者的行为,适用于观察者模式。
观察者设计模式后对系统架构和代码结构带来了哪些好处:观察者设计模式降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。使代码结构更清晰。
应用范例完整的源代码 : https://github.com/LiScott012/DesignPatterns.git
原文:https://www.cnblogs.com/LiScott/p/11997092.html