欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
1. 代理模式主要有两种:静态代理和动态代理
2. 静态代理:
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
Java代码
package ttitfly.proxy;
public interface HelloWorld {
public void print();
// public void say();
}
package ttitfly.proxy;
public interface HelloWorld {
public void print();
// public void say();
}
B: 定义一个该接口的实现类
Java代码
package ttitfly.proxy;
public class HelloWorldImpl implements HelloWorld{
public void print(){
System.out.println(“HelloWorld”);
}
// public void say(){
// System.out.println(“Say Hello!”);
// }
}
package ttitfly.proxy;
public class HelloWorldImpl implements HelloWorld{
public void print(){
System.out.println(“HelloWorld”);
}
// public void say(){
// System.out.println(“Say Hello!”);
// }
}
C:定义一个静态代理类
Java代码
package ttitfly.proxy;
public class StaticProxy implements HelloWorld{
public HelloWorld helloWorld ;
public StaticProxy(HelloWorld helloWorld){
this.helloWorld = helloWorld;
}
public void print(){
System.out.println(“Welcome”);
//相当于回调
helloWorld.print();
}
// public void say(){
// //相当于回调
// helloWorld.say();
// }
}
package ttitfly.proxy;
public class StaticProxy implements HelloWorld{
public HelloWorld helloWorld ;
public StaticProxy(HelloWorld helloWorld){
this.helloWorld = helloWorld;
}
public void print(){
System.out.println(“Welcome”);
//相当于回调
helloWorld.print();
}
// public void say(){
// //相当于回调
// helloWorld.say();
// }
}
D: 一个测试类:
Java代码
package ttitfly.proxy;
public class TestStaticProxy {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorldImpl();
StaticProxy staticProxy = new StaticProxy(helloWorld);
staticProxy.print();
// staticProxy.say();
}
}
package ttitfly.proxy;
public class TestStaticProxy {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorldImpl();
StaticProxy staticProxy = new StaticProxy(helloWorld);
staticProxy.print();
// staticProxy.say();
}
}
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
[1][2]
所有的赏赐都只是被用来奖励工作成果的。