代理模式 是 代替这个对象 在这个对象基础上进行拓展这个拓展包含成员变量的拓展和方法的拓展,你所拿到的对象也是一个。
装饰者模式是 在这个对象基础上增加一些成员变量和拓展方法,可以装饰出来一个对象,也可以装饰出来的类型有多个。而且,更加厉害的是 你在原来装饰的基础之上还可以再装饰。这个就比较厉害了。
区别 两点 1,代理模式 单一 装饰者模式多 2,装饰者模式 可以装饰再装饰 多层装饰。
public interface Animal {
void run();
}
package com.mrchen.mythirdspring.proxytest;
public class Dog implements Animal{
@Override
public void run() {
System.out.println("dog run");
}
}
package com.mrchen.mythirdspring.proxytest;
public class DogProxy implements Animal{
Animal animal;
public DogProxy(Animal animal) {
this.animal = animal;
}
@Override
public void run() {
animal.run();
System.out.println("run happy");
}
public void jump(){
System.out.println("dog jump");
}
}
package com.mrchen.mythirdspring.proxytest;
public class TestProxy {
public static void main(String[] args){
Dog dog=new Dog();
DogProxy dogProxy=new DogProxy(dog);
dogProxy.run();
}
}
装饰者模式
package com.mrchen.mythirdspring.decortest;
public interface Animal {
void run();
}
package com.mrchen.mythirdspring.decortest;
public class Dog implements Animal {
@Override
public void run() {
System.out.println("dog run");
}
}
package com.mrchen.mythirdspring.decortest;
public abstract class DecorAbstract implements Animal{
private Animal animal;
public DecorAbstract(Animal animal) {
this.animal = animal;
}
@Override
public void run() {
animal.run();
}
}
package com.mrchen.mythirdspring.decortest;
public class GoodDog extends DecorAbstract{
public GoodDog(Animal animal) {
super(animal);
}
@Override
public void run() {
super.run();
System.out.println("goo dog run");
}
}
package com.mrchen.mythirdspring.decortest;
public class SongDog extends DecorAbstract{
public SongDog(Animal animal) {
super(animal);
}
@Override
public void run() {
super.run();
System.out.println("dog song 狗会唱歌");
}
}
package com.mrchen.mythirdspring.decortest;
public class TestDecor {
public static void main(String[] args){
Animal animal=new Dog();
Animal goodDog=new GoodDog(animal);
goodDog.run();
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
Animal songDog=new SongDog(goodDog);
songDog.run();
}
}
https://www.cnblogs.com/boboxing/p/8126046.html