代理模式和装饰器模式实现起来很像,那他们的区别在哪呢。我喜欢从名字上分析,装饰只是加点东西,而代理是全权的。所以装饰改的是一个接口的方法(当然装饰可以嵌套),而代理是所有的方法(当然java动态代理只能更改有接口的)。代理分为静态代理和动态代理,下面上静态代理代码:
public class Proxy {
interface Draw {
String draw();
}
public static class 物体 implements Draw {//英文不好请原谅
protected String name;
protected String color;
public 物体(String name, String color) {
this.name = name;
this.color = color;
}
@Override
public String draw() {
return "画个" + color + name;
}
public void printName() {
System.out.println(color + name);
}
}
public static class 雕花物体 implements Draw {
private 物体 物体;
public 雕花物体(物体 物体) {
this.物体 = 物体;
}
public String draw() {//装饰会有装饰接口像Draw
return "画个" + 物体.color + "雕花" + 物体.name;
}
public void printName() {//和装饰模式的区别在于,不是接口的也要实现
System.out.println(物体.color + "雕花" + 物体.name);
}
}
public static void main(String[] args) {
物体 物体 = new 物体("球", "红色");
物体.printName();
System.out.println(物体.draw());
雕花物体 雕花物体 = new 雕花物体(物体);
雕花物体.printName();
System.out.println(雕花物体.draw());
}
}
可以看出,这就相当于继承重写吗。为啥要整个代理呢?这就是我们下面要说的动态代理,也是最实用的。
动态代理代码:就看一下java的动态代理吧
最后:面向对象的23种设计模式点这里。