設計模式(三)代理模式
阿新 • • 發佈:2018-12-18
代理模式:一個代理角色和一個真正的角色,代理角色代替真正角色執行操作
代理模式又分為靜態代理模式和動態代理模式。
靜態代理模式:
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()
收錢
本文參考武哥