设计模式之代理模式简单实现
程序员文章站
2022-05-15 10:57:43
...
简介
- 代理模式通常用于达到对原有系统功能进行扩充的目的,比如:你刚接手一个别人没有完成的项目,这时你不想动别人原来的代码,还需要添加新功能。这时代理模式,这时代理模式会很好的帮我们解决问题
- 代理模式一般分为静态代理,动态代理两种
静态代理
静态代理一般是由一个接口、若干实现类、若干代理类构成。
代码实现
先定义一个接口
public interface IFilmStar {
void kungFu() ;
}
定义它的实现类(真实类)
public class FilmStarImpal1 implements IFilmStar {
@Override
public void kungFu() {
System.out.println("成龙");
}
}
定义它的代理类,在静态代理中他的代理类和实现类都是实现了同一个接口
public class FilmStarImpl implements IFilmStar {
private FilmStarImpal1 dd; //定义一个私有
public FilmStarImpl(FilmStarImpal1 dd) {
this.dd=dd;
}
@Override
public void kungFu() {
this.dd.kungFu();
}
}
定义一个测试类
public class Test {
public static void main(String[] args) {
FilmStarImpl f = new FilmStarImpl(new FilmStarImpal1());
f.kungFu();
}
}
上面就构成了一个最简单的静态代理模式,代理类聚合了被代理类,且代理类及被代理类都实现了同一个接口,可实现灵活多变。继承式的实现方式则不够灵活。
缺点就是如果在追加两个功能那么还需要在创建两个代理类,这样就会导致代理类越来越多,管理越来越困难。这是动态代理就运用而生了
动态代理
学习动态代理,不可避免的要用到下面一个接口和一个类。
- InvocationHandler接口
- Proxy类
下面进行一个简单的代码实现,为了方便就只用了一个功能接口(没有凸显出动态代理的灵活性)
定义接口
public interface IFilmStar {
public void kungFu() ;
}
定义实现类(真实类)
public class FilmStar implements IFilmStar {
@Override
public void kungFu() {
System.out.println("FilmStar.kungFu()");
}
}
定义InvocationHandler接口的实现类
public class sss implements InvocationHandler {
private Object temp; //真实对象
public sss(Object temp) {
this.temp = temp;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy 表示代理对象,method 表示被代理的真实对象的方法,args表示方法对应的参数
method.invoke(temp, args);
return null;
}
}
定义测试类
public class Tets {
public static void main(String[] args) {
IFilmStar temp = (IFilmStar) Proxy.newProxyInstance(IFilmStar.class.getClassLoader(), new Class[] {IFilmStar.class}, new sss(new FilmStar())); //三个参数分别是 类加载器、真实对象实现的所有接口以及对应的代理InvocationHandler
temp.kungFu();
}
}
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理。在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样对每一个方法或方法组合进行处理
上一篇: Mybatis第二天 使用MyBatis进行CRUD操作
下一篇: Session