1.代理模式:
两个子类共同实现一个接口,其中一个子类负责真实业务的实现,一个子类负责辅助真实业务的操作。
2.本质:
所有真实的业务操作都会有一个相应的辅助类(工具类)共同完成。
3.代码实现:
package www.first;
//业务接口
interface IBuy{
void buyPuma();
}
//真实业务类
class RealBuyImpl implements IBuy{
@Override
public void buyPuma() {
System.out.println("buy Puma");
}
}
//辅助类
class HelpBuyImpl implements IBuy{
//实例化真实业务对象
private IBuy iBuy;
public HelpBuyImpl(IBuy iBuy){
this.iBuy = iBuy;
}
//通过辅助类来辅助真实业务类实现业务操作
@Override
public void buyPuma() {
this.preBuy();
this.iBuy.buyPuma();
this.afterBuy();
}
public void preBuy(){
System.out.println("before buy");
}
public void afterBuy(){
System.out.println("after buy");
}
}
public class DaiLi {
public static void main(String[] args) {
IBuy buy = new HelpBuyImpl(new RealBuyImpl());
buy.buyPuma();
}
}
结果如下:
4.从上面的代码,我们可以看到,真实的业务操作需要通过代理类来辅助完成。我们不难联想到,在Java中最经典的代理模式其实就是,通过Runnable接口实现多线程的操作。
class Start implements Runnable{
@Override
public void run() {
System.out.println("Starting");
}
}
public class DaiLi {
public static void main(String[] args) {
Runnable runnable = new Thread(new Start());
runnable.run();
}
}
不难看出,Runnable是业务接口,Thread类是负责完成资源调度、系统分配的辅助线程业务类,而我们自定义实现业务接口Runnable的子类Start负责真实业务的实现。
结果如下: