TreeviewCopyright © qgao 2021-* all right reserved, powered by aleen42

委托模式

Client.java

package com.bermuda.surface;

import com.bermuda.informer.Boss;
import com.bermuda.informer.Informer;
import com.bermuda.observer.Observer;
import com.bermuda.observer.StockObserver;

/**
 * 先有了观察者模式,再有的委托模式(弥补了观察者模式的不足)
 */
public class Client {

    public static void main(String[] args) {
        Informer boss = new Boss();

        StockObserver stockObserver1 = new StockObserver(boss,"stockObserver1");
        StockObserver stockObserver2 = new StockObserver(boss,"stockObserver2");

        boss.attach("stockObserver1",stockObserver1,"closeStock");
        boss.attach("stockObserver2",stockObserver2,"closeStock");

        boss.setInformerState("boss come in");
        boss.notice();
    }
}

Informer.java

package com.bermuda.informer;

import com.bermuda.handler.EventHandler;
import com.bermuda.observer.Observer;

public abstract class Informer {

    private String informerState;
    protected EventHandler eventHandler = new EventHandler();

    public String getInformerState() {
        return informerState;
    }

    public void setInformerState(String informerState) {
        this.informerState = informerState;
    }

    public abstract void attach(String description,Object object, String methodName, Object...params);
    public abstract void detach(String description);

    public abstract void notice();
}

Boss.java

package com.bermuda.informer;

import com.bermuda.observer.Observer;

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

public class Boss extends Informer {

    public void attach(String description,Object object, String methodName, Object...params) {
        eventHandler.addEvent(description,object,methodName,params);
    }

    public void detach(String description) {
        eventHandler.removeEvent(description);
    }

    public void notice() {
        try {
            eventHandler.notifyAllEvents();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

EventHandler.java

package com.bermuda.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EventHandler {

    private Map<String,Event> eventMap = new HashMap<String, Event>();

    public void addEvent(String description,Object object, String methodName, Object...params){
        eventMap.put(description,new Event(object,methodName,params));
    }

    public void removeEvent(String description){
        if(eventMap.containsKey(description)){
            eventMap.remove(description);
        }else {
            System.out.println("no this event");
        }

    }

    public void notifyAllEvents() throws Exception{
        for(Event event:eventMap.values()){
            event.invoke();
        }
    }
}

Event.java

package com.bermuda.handler;

import java.lang.reflect.Method;

public class Event {

    //要执行方法的对象
    private Object object;
    //要执行的方法名称
    private String methodName;
    //要执行方法的参数
    private Object[] params;
    //要执行方法的参数类型
    private Class[] paramTypes;

    public Event() {
    }

    public Event(Object object, String methodName, Object...params) {
        this.object = object;
        this.methodName = methodName;
        this.params = params;
        contractParamTypes(params);
    }

    //根据参数数组生成参数类型数组
    private void contractParamTypes(Object[] params){
        this.paramTypes=new Class[params.length];
        for(int i=0;i<params.length;i++){
            this.paramTypes[i]=params[i].getClass();
        }
    }

    public void invoke() throws Exception{
        Method method=object.getClass().getMethod(methodName,paramTypes);
        if(null==method){
            return;
        }
        method.invoke(object, params);
    }
}

Observer.java

package com.bermuda.observer;

import com.bermuda.informer.Informer;

public abstract class Observer {
    protected Informer informer;
    protected String observerName;

    public Observer(Informer informer, String observerName) {
        this.informer = informer;
        this.observerName = observerName;
    }

}

StockObserver.java

package com.bermuda.observer;

import com.bermuda.informer.Informer;

public class StockObserver {

    private Informer informer;
    private String observerName;

    public StockObserver(Informer informer, String observerName) {
        this.informer = informer;
        this.observerName = observerName;
    }

    public void closeStock() {
        System.out.println(informer.getInformerState()+":"+observerName+" close the stock situation");
    }
}
Copyright © qgao 2021-* all right reserved,powered by Gitbook该文件修订时间: 2022-07-08 21:13:28

results matching ""

    No results matching ""