public interface Subject { public void Rread(); }
public class ReadSubject implements Subject{ //这里是单例用法,这个类主要是为了给ResultSubject提供Subject实例 static ReadSubject rs=new ReadSubject(); private ReadSubject(){ } public static ReadSubject getReadSubject(){ return rs; } public static Subject getSubject(){ return new ReadSubject(); } @Override public void Rread() { System.out.println("生成方法的中间类"); } }
public class StaticProxy implements Subject{ //这个静态代理类用来重写接口Subject的Rread方法 private Subject rs=null; //这个是构造函数为了使需要重写类与该类建立联系,达到重写Rread的目的 //具体是new StaticProxy(rs.getSubject()) public StaticProxy(Subject rs){ this.rs=rs; } @Override public void Rread() { System.out.println("hello world"); } }
public class ResultSubject{ ReadSubject rs=ReadSubject.getReadSubject(); public Subject s=null; public ResultSubject(){ s=rs.getSubject();//这样将不会重写Subject的Rread方法 } }
public class ResultSubject{ ReadSubject rs=ReadSubject.getReadSubject(); public Subject s=null; public ResultSubject(){ //这样利用静态代理可以达到重写的目的 s=new StaticProxy(rs.getSubject()); } }
public class Test { public static void main(String[] args) { // Subject subject=new StaticProxy(new ResultSubject()); // subject.Rread(); ResultSubject rs=new ResultSubject(); Subject s=rs.s; s.Rread(); } }
运行结果是hello world
可见我们确实重写了Subject接口的Rread方法
这里主要是在StaticProxy类中我们加入了Subject接口实例赋值,在ResultSubject类中我们利用StaticProxy类来引入Subject接口实例实例,所以从ResultSubject类 中得到的Subject接口实例都经过StaticProxy类 从而重写了Rread方法
这里主要是为了解决例如:在连接数据库时,自己写DAO时 只能利用DriverManager.getConnection来获得Connection接口实例,又想在接下来的操作中重写close时会用到。
时间: 2024-10-14 23:42:40