首先创建一个接口,来表示歌手,所有的歌手都会唱歌
public interface Sing {
//所有的歌手都会唱歌
void Sing();
}
远古时期。。。。有一个歌手,这个歌手唱的歌特别的经典,好听
所以实现歌手的接口
public class Singer implements Sing{
//远古歌手
@Override
public void Sing() {
System.out.println("经典歌曲");
}
}
现在呢。。。有一个歌手要唱歌,上来就唱了一首经典歌曲曲来致敬远古大佬
当然他也是歌手,也要实现歌手唱歌这个接口
至于SingerProxy的构造方法我下面再解释
/**
* 代理对象和目标对象实现相同的接口
*/
public class SingerProxy implements Sing{
Sing sing;
public SingerProxy(Sing s){
this.sing = s;
}
@Override
public void Sing() {
System.out.println("观众们好,我唱一个");
sing.Sing();
System.out.println("谢谢再见");
}
}
现在搞一个测试,开个演唱会 让当代歌手唱个歌
public class Test {
public class Test {
public static void main(String[] args) {
SingerProxy singerProxy = new SingerProxy(new Singer());
System.out.println("演唱会");
singerProxy.Sing();
}
}
输出结果
执行顺序是这样的
-
Test中
SingerProxy singerProxy = new SingerProxy(new Singer())
实例化现代歌手,把远古歌手唱的歌塞到SingerProxy的构造方法中 -
然后走输出演唱会
-
再走现代歌手对象的唱歌方法,之前已经把远古歌手唱的歌塞到构造方法中了,所以现代歌手再唱歌唱的就是经典歌曲了
其实代理模式,就是用一个新的类(现代歌手),把接口(歌手都要唱歌)以及实现类(远古歌手),重新编写一次,这个类就可以叫做代理类