假设没有中间代理层:
接口
/**
*
*/
package com.tree.demo.proxy;
/**
* ClassName:ITalkInterface <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2014年12月25日 下午3:41:56 <br/>
* @author chiwei
* @version
* @since JDK 1.6
* @see
*/
public interface ITalkInterface {
public String talk(String msg,String who);
}
实现类
package com.tree.demo.proxy;
/**
* ClassName:Student <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2014年12月25日 下午3:46:19 <br/>
*
* @author chiwei
* @version
* @since JDK 1.6
* @see
*/
public class Student implements ITalkInterface {
private String school;
private String grade;
private int age;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
}
public Student(String school, String grade, int age) {
super();
this.school = school;
this.grade = grade;
this.age = age;
}
@Override
public String talk(String msg, String who) {
// TODO Auto-generated method stub
return "Hi " + who + ",I am a Student" + ",I'm in School "
+ this.getSchool() + ",grade " + this.getGrade() + ","
+ this.getAge() + " years old ! I want to say " + msg;
}
}
实现类
package com.tree.demo.proxy;
/**
* ClassName:Worker <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2014年12月25日 下午3:51:16 <br/>
*
* @author chiwei
* @version
* @since JDK 1.6
* @see
*/
public class Worker implements ITalkInterface {
private String factory;
private double salary;
public String getFactory() {
return factory;
}
public void setFactory(String factory) {
this.factory = factory;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Worker() {
}
public Worker(String factory, double salary) {
super();
this.factory = factory;
this.salary = salary;
}
@Override
public String talk(String msg, String who) {
// TODO Auto-generated method stub
return "Worker: " + who + " say " + msg + ",factory:"
+ this.getFactory() + ",salary:" + this.getSalary();
}
}
从以上代码,我们看到学生和工人都实现了talk接口,也都重写了额alk方法
这时候如果说学生或者工人都想唱歌怎么办呢?
难道talk接口添加唱歌方法,然后学生和工人实现类都实现唱歌方法???而且还是必须得实现唱歌方法,不唱都不行啊!!!这是不是很坑爹呢?????
这时候我们就需要一个中间代理层来解决这个问题了!!!
代理类
package com.tree.demo.proxy;
/**
* ClassName:TalkProxy <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2014年12月25日 下午3:55:31 <br/>
* @author chiwei
* @version
* @since JDK 1.6
* @see
*/
public class TalkProxy implements ITalkInterface {
ITalkInterface talk;
public TalkProxy(ITalkInterface talk) {
System.out.println(talk.getClass().getName());
this.talk = talk;
}
@Override
public String talk(String msg, String who) {
// TODO Auto-generated method stub
return talk.talk(msg, who);
}
public String sing(String song) {
return "I am singing a song named " + song;
}
}
注意此代理类的结构,实现了接口,并且通过构造方法去初始化内部的接口变量,而且在代理类中实现了唱歌!!!
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1 = new Student("TsingHua","1",22);
System.out.println(s1.talk("s1", "Jim"));
Worker w1 = new Worker("China Mobile", 2000.0);
System.out.println(w1.talk("w1", "Tom"));
TalkProxy tp = new TalkProxy(s1);
System.out.println(tp.sing("我的中国梦"));
TalkProxy tp2 = new TalkProxy(w1);
System.out.println(tp2.sing("咱们老百姓"));
}
这里的代理类的作用也就是代理了一个唱歌的方法,想唱歌就不用再去修改接口,修改实现类了,很简单,很灵活!
如果你还想骂人,就在代理类里添加一个骂人的方法,谁想骂人就传谁进去就行了!!!
原文地址:http://blog.csdn.net/simonchi/article/details/42167923