代理模式
就是相当于经纪人,中介,两个实体之间不直接接触,经纪人来处理事情,解耦,更加灵活
歌手接口,对歌手类的进一步抽象:
public interface Singer {
void singing();
void danceing();
}
具体歌手小孟
继承歌手接口方法
public class Meng implements Singer {
@Override
public void singing() {
System.out.println("小孟在唱歌");
}
@Override
public void danceing() {
System.out.println("小孟在跳舞");
}
}
歌手直接和合作者联系吗,耦合性太强,要找个代理
代理实现加一些方法,唱歌前收费
public class Agent implements Singer{
private Meng xiaomeng=new Meng();
@Override
public void singing() {
System.out.println("唱歌前收钱!");
xiaomeng.singing();
}
@Override
public void danceing() {
System.out.println("跳舞前收钱!");
xiaomeng.danceing();
}
}
测试:
public class Test {
public static void main(String[] args) {
//Singer接口都实现了,多态,解耦
Singer singer=new Meng();
Singer agent=new Agent();
//反射获取对象
Object o=Proxy.newProxyInstance(Singer.class.getClassLoader(),singer.getClass().getInterfaces(),
new SingerHandler(singer));
//判断是不是Singe类型,if包着,不会因为类型不同直接报错结束
if(o instanceof Singer) {
Singer s = (Singer) o;
s.singing();
s.danceing();
s.toString();
s.hashCode();
}
Object o1=Proxy.newProxyInstance(Singer.class.getClassLoader(),agent.getClass().getInterfaces(),
new SingerHandler(agent));
if(o1 instanceof Singer){
Singer s1=(Singer)o1;
s1.singing();
s1.danceing();
s1.toString();
s1.hashCode();
}
}
}
//调用处理器
class SingerHandler implements InvocationHandler{
private Singer singer;
public SingerHandler(Singer singer) {
this.singer = singer;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName());
//在外层就可以添加方法,不用改变源代码
//指定ing结尾函数处理
if(method.getName().endsWith("ing")){
System.out.println("ing结尾的");
}
//每次调用时输出
System.out.println("加钱");
//反射调用函数
return method.invoke(singer,args);
}
}
运行结果: