代理模式和装饰器模式区别

参考https://blog.csdn.net/andong154564667/article/details/80258061

 

根据自己的理解,做了一点点修改。

两种模式的作用:用于AOP,不改变原有实现的情况下,进行功能扩展,proxy模式比较适合固定的AOP功能需求,decorator比较适合动态扩展的AOP需求

1. 同样的事情,proxy模式和decorator模式都能实现,都是用来实现AOP的,关键在于可扩展性方便的区别,是否更满足单一职责原则和开闭原则

来选择哪种模式

2.proxy模式是,对于需要代理的类A,A可以是interface,提供一个代理类ProxyA,A想要增加的功能都在ProxyA不停的增加根据不断的需求。

3. decorator模式是,对于需要装饰的类A,A可以是interface,如果A需要增加一个功能func1,则提供一个装饰类Func1DecoratorA,如果A还需要增加一个功能func2,则提供一个装饰类Func2DecoratorA,如果A还需要增加一个功能func3,则提供一个装饰类Func3DecoratorA,以此类推...,对于每一个单一的功能扩展需要,都一个FuncNDecoratorA,这样

就能保证满足开闭原则和单一职责原则。

通过代理模式实现

套用https://blog.csdn.net/andong154564667/article/details/80258061的例子:

public interface Greeting {
 
    void sayHello(String name);
}
public class GreetingImpl implements Greeting {
 
    @Override
    public void sayHello(String name) {
        System.out.println("Hello! " + name);
    }
}
public class GreetingProxy implements Greeting {
 
    private Greeting greetingImpl;
 
    public GreetingProxy(Greeting greeting) {
        this.greetingImpl = greeting;
    }
 
    @Override
    public void sayHello(String name) {
        before();
        func1();
        func2();
        func3();
        greetingImpl.sayHello(name);
        after();
    }
 
    private void before() {
        System.out.println("Before");
    }
    private void func1() {
        System.out.println("func1");
    }
    private void func2() {
        System.out.println("func2");
    }
    private void func3() {
        System.out.println("func3");
    }
    private void after() {
        System.out.println("after");
    }
}

注意,GreetingProxy的构造函数的入参从具体实现GreetingImpl改成了接口Greeting, 新的功能扩展func1, func2, func3都是直接修改GreetingProxy类中的sayHello方法。这样会破坏单一职责原则(GreetingProxy包含的功能越来越多)和开闭原则(每一次新的功能需求都得修改原来的GreetingProxy类)

public class ClientProxy {
 
    public static void main(String[] args) {
        Greeting greeting = new GreetingProxy(new GreetingImpl());
        greeting.sayHello("Jack");
    }
}

而通过decorator模式,则:

public abstract class GreetingDecorator implements Greeting {
 
    private Greeting greeting;
 
    public GreetingDecorator(Greeting greeting) {
        this.greeting = greeting;
    }
 
    @Override
    public void sayHello(String name) {
        greeting.sayHello(name);
    }
}

GreetingDecorator 只是一个抽象的装饰器,要想真正使用它,您得去继承它,实现具体的装饰器才行,他存在的作用相当于一个decorator parent类,用来继承,同时用来调用传入的greeting的功能(即某个greeting的具体实现的原始功能

public class GreetingBefore extends GreetingDecorator {
 
    public GreetingBefore(Greeting greeting) {
        super(greeting);
    }
 
    @Override
    public void sayHello(String name) {
        before();
        super.sayHello(name);
    }
 
    private void before() {
        System.out.println("Before");
    }
}
public class GreetingAfter extends GreetingDecorator {
 
    public GreetingAfter(Greeting greeting) {
        super(greeting);
    }
 
    @Override
    public void sayHello(String name) {
        super.sayHello(name);
        after();
    }
 
    private void after() {
        System.out.println("After");
    }
}
public class GreetingFunc1 extends GreetingDecorator {
 
    public GreetingFunc1 (Greeting greeting) {
        super(greeting);
    }
 
    @Override
    public void sayHello(String name) {
        super.sayHello(name);
        func1();
    }
 
    private void func1() {
        System.out.println("func1");
    }
}
public class GreetingFunc2 extends GreetingDecorator {
 
    public GreetingFunc2 (Greeting greeting) {
        super(greeting);
    }
 
    @Override
    public void sayHello(String name) {
        super.sayHello(name);
        func2();
    }
 
    private void func2() {
        System.out.println("func2");
    }
}

public class GreetingFunc3 extends GreetingDecorator {
 
    public GreetingFunc3 (Greeting greeting) {
        super(greeting);
    }
 
    @Override
    public void sayHello(String name) {
        super.sayHello(name);
        func3();
    }
 
    private void func3() {
        System.out.println("func3");
    }
}

测试类:

public class ClientDecorator {
 
    public static void main(String[] args) {
        Greeting greeting = new GreetingAfter(new GreetingBefore(new GreetingImpl()));
        greeting.sayHello("Jack brfore after");
        Greeting greeting = new GreetingAfter(new GreetingFunc1(new GreetingBefore(new GreetingImpl())));
        greeting.sayHello("Jack with brfore func1 after ");
        Greeting greeting = new GreetingAfter(new GreetingFunc2(new GreetingFunc1(new GreetingBefore(new GreetingImpl()))));
        greeting.sayHello("Jack with brfore func1 func2 after");
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值