比如用JAVA实现SOCKET通信,是不是有种更好的写法: 用observer模式,EVENT触发,消息通知? 
求这方面的例子,不是要observer模式例子,而是和通信相关的例子

解决方案 »

  1.   

    有时候observer也不一定好写,因为你不知道去怎么捕获事件
    模拟起来很简单,比如server.receiveMsg(),然后触发,实际上收到消息这个事件在代码里不知道怎么实现等待阻塞也许实现起来更简单
    纯属个人意见,也没啥这方面经验
      

  2.   

    Test.javapackage com.bjsxt.dp.observer;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;
    class WakenUpEvent {
    private long time;
    private String loc;
    private Child source;

    public WakenUpEvent(long time, String loc, Child source) {
    super();
    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 Child implements Runnable {
    private List<WakenUpListener> wakenUpListeners = new ArrayList<WakenUpListener>(); public void addWakenUpListener(WakenUpListener l) {
    wakenUpListeners.add(l);
    }

    void wakeUp() {
    for(int i=0; i<wakenUpListeners.size(); i++) {
    WakenUpListener l = wakenUpListeners.get(i);
    l.ActionToWakenUp(new WakenUpEvent(System.currentTimeMillis(), "bed", this));
    }
    } public void run() {
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    this.wakeUp();
    }

    }class Dad implements WakenUpListener { public void ActionToWakenUp(WakenUpEvent wakenUpEvent) {
    System.out.println("feed child");
    }

    }class GrandFather  implements WakenUpListener { public void ActionToWakenUp(WakenUpEvent wakenUpEvent) {
    System.out.println("hug child");
    }

    }class Dog implements WakenUpListener { public void ActionToWakenUp(WakenUpEvent arg0) {
    System.out.println("wang wang ...");
    }

    }interface WakenUpListener {
    public void ActionToWakenUp(WakenUpEvent wakenUpEvent);
    }public class Test {
    public static void main(String[] args) {
    Child c = new Child();


    String[] observers = PropertyMgr.getProperty("observers").split(","); for(String s : observers) {
    try {
    c.addWakenUpListener((WakenUpListener)(Class.forName(s).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/bjsxt/dp/observer/observer.properties"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static String getProperty(String key) {
    return props.getProperty(key);
    }
    }class CryEvent {
    }abstract class Event {}Test.javapackage com.bjsxt.dp.observer.awt;import java.util.ArrayList;
    import java.util.List;
    public class Test {
    public static void main(String[] args) {
    Button b = new Button();
    b.addActionListener(new MyActionListener());
    b.addActionListener(new MyActionListener2());
    b.buttonPressed();
    }
    }class Button {

    private List<ActionListener> actionListeners = new ArrayList<ActionListener>();

    public void buttonPressed() {
    ActionEvent e = new ActionEvent(System.currentTimeMillis(),this);
    for(int i=0; i<actionListeners.size(); i++) {
    ActionListener l = actionListeners.get(i);
    l.actionPerformed(e);
    }
    }

    public void addActionListener(ActionListener l) {
    actionListeners.add(l);
    }
    }interface ActionListener {
    public void actionPerformed(ActionEvent e);
    }class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) {
    System.out.println("button pressed!");
    }

    }class MyActionListener2 implements ActionListener { public void actionPerformed(ActionEvent e) {
    System.out.println("button pressed 2!");
    }

    }class ActionEvent {

    long when;
    Object source;

    public ActionEvent(long when, Object source) {
    super();
    this.when = when;
    this.source = source;
    }


    public long getWhen() {
    return when;
    } public Object getSource() {
    return source;
    }

    }TestFrame.javapackage com.bjsxt.dp.observer.awt;import java.awt.Button;
    import java.awt.Frame;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;public class TestFrame extends Frame {
    public void launch() {
    Button b = new Button("press me");
    b.addActionListener(new MyActionListener());
    b.addActionListener(new MyActionListener2());
    this.add(b);
    this.pack();

    this.addWindowListener(new WindowAdapter(){ @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }

    });

    this.setVisible(true);
    }

    public static void main(String[] args) {
    new TestFrame().launch();
    }

    private class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) {
    System.out.println("button pressed!");
    }

    }

    private class MyActionListener2 implements ActionListener { public void actionPerformed(ActionEvent e) {
    System.out.println("button pressed 2!");
    }

    }
    }