您的位置:首页 > 其它

23种设计模式之代理模式

2018-01-25 14:14 316 查看

静态代理(静态定义代理类)

这里我举一个就是明星和经济人的关系,经纪人可以管理面谈,签合同,订票,收钱,除了唱歌

明星接口

public interface Star {
/**
* 面谈
*/
void confer();

/**
* 签合同
*/
void signContract();

/**
* 订票
*/
void bookTicket();

/**
* 唱歌
*/
void sing();

/**
* 收钱
*/
void collectMoney();
}


真实类对象

public class RealStar implements Star {

@Override
public void bookTicket() {
System.out.println("明星订票");
}

@Override
public void collectMoney() {
System.out.println("明星收钱");
}

@Override
public void confer() {
System.out.println("明星面试");
}

@Override
public void signContract() {
System.out.println("明星签合同");
}

@Override
public void sing() {
System.out.println("明星(周杰伦本人)唱歌");
}

}


代理人对象

public class ProxyStar implements Star {
private RealStar star;

public ProxyStar(RealStar star) {
this.star = star;
}

@Override
public void bookTicket() {
System.out.println("经纪人订票");
}

@Override
public void collectMoney() {
System.out.println("经纪人收钱");
}

@Override
public void confer() {
System.out.println("经纪人面试");
}

@Override
public void signContract() {
System.out.println("经纪人签合同");
}

@Override
public void sing() {
star.sing();
}

}


测试

RealStar star = new RealStar();
ProxyStar proxy=new ProxyStar(star);
proxy.confer();
proxy.signContract();
proxy.bookTicket();
proxy.sing();
proxy.collectMoney();


动态代理对象

创建一个StartHandler继承于InvocationHandler

public class StartHandler implements InvocationHandler {
Star realStar;

public StartHandler(Star realStar) {
this.realStar = realStar;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null;
if (method.getName().equals("sing")) {
object = method.invoke(realStar, args);//激活这个方法
}
return object;
}
}


测试

RealStar realStar = new RealStar();
StartHandler handler = new StartHandler(realStar);
Star star = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader()
, new Class[]{Star.class}, handler);
star.sing();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: