1. 程式人生 > >設計模式(三)代理模式

設計模式(三)代理模式

代理模式:一個代理角色和一個真正的角色,代理角色代替真正角色執行操作

代理模式又分為靜態代理模式和動態代理模式。

靜態代理模式:

1、首先抽象角色(參考武哥的例子)

package 代理模式;

//介面類定義方法
public interface Star {
	public void confer(); //面談
	public void sing();  //唱歌
	public void collectMoney(); //收錢
}

2、真正角色類(對接口裡的方法重寫)

package 代理模式;

//真正的角色,被代理的角色
public class RealStar implements Star {
	@Override
	public void confer() {
		System.out.println("RealStar 面談");
	}
	
	@Override
	public void sing() {
		System.out.println("RealStar 唱歌(明星)");
	}
	
	@Override
	public void collectMoney() {
		System.out.println("RealStar 收錢");
	}

}

3、代理類(代理上面真正角色類)

package 代理模式;

//代理類
public class ProxyStar implements Star{
	
	public Star star;
	
	public ProxyStar(Star star) {
		super();
		this.star = star;
	}

	@Override
	public void confer() {
		System.out.println("ProxyStar 面談");
	}
	
	@Override
	public void sing() {
		//其他事都能幹,唯一不能幹的就是唱歌,唱歌還是得要周杰倫本人來唱
        star.sing(); //讓他本人來唱
	}
	
	@Override
	public void collectMoney() {
		System.out.println("ProxyStar 收錢");
	}
}

不需要真正角色做的事直接重寫方法,不能代替的讓其本人做即:

//其他事都能幹,唯一不能幹的就是唱歌,唱歌還是得要周杰倫本人來唱
        star.sing(); //讓他本人來唱

4、測試類:

package 代理模式;

public class test {
	
	public static void main(String[] args) {
		Star r1 = new RealStar();
		Star  p1 = new ProxyStar(r1);
		p1.confer();
		p1.sing();
		p1.collectMoney();
	}

}

動態代理模式:

動態代理交給工具來管。是動態代理需要實現invocationHandler介面,並重寫裡面的Invoke方法,如下:

由上改變:

1、代理類即可:


public class StarHandler implements InvocationHandler {

    Star realStar;

    public StarHandler(Star realStar) {
        super();
        this.realStar = realStar;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {

        Object object = null;

        // 在代理真實物件前,我們可以做些自己的操作
        System.out.println("面談");

        if(method.getName().equals("sing")) {
            object = method.invoke(realStar, args);
        }

        // 在代理真是物件後,我們可以做些自己的操作
        System.out.println("收錢");

        return object;
    }

}

2、測試類:

public class Client {

    public static void main(String[] args) {

        Star realStar = new RealStar();
        StarHandler handler = new StarHandler(realStar);

        //建立代理類
        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);       

        proxy.sing();
    }

}

3、結果:

面談 
RealStar(周杰倫).sing() 
收錢

本文參考武哥