JAVA设计模式:代理模式&& 装饰模式区别

在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解:

 

装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖。

复制代码
public interface Sourcable {

    public void go();
}

public class Source implements Sourcable {

    public void go() {
        System.out.println("Source method go()");
    }

}
public class Decorator implements Sourcable {

    private Sourcable sourcable;
    
    public Decorator(Sourcable sourcable){
        this.sourcable = sourcable;
    }
    
    public void go() {
                //这里可以有你的处理
        sourcable.go();
                //这里可以有你的处理
    }

}
复制代码

 

代理模式就像生活中的一些代理商一样,他们原本不做任何事,但是我们可以通过他买到一些我们需要的东西。

复制代码
public class ObjectDynamicProxy implements InvocationHandler{

    //真实对象引入
    private Object proxyObj;

    public void setObj(Object obj) {
        this.proxyObj = obj;
    }
    
    public ObjectDynamicProxy(Object obj){
        this.proxyObj = obj;
    }

    public Object invoke(Object object, Method method, Object[] args)
            throws Throwable {
        
        System.out.println("before dynamic proxy method.");
        
        Object obj = method.invoke(proxyObj, args);
        
        System.out.println("after dynamic proxy method.");
        
        return obj;
    }
    
    /**
     * 代理对象生产工厂
     * @param obj
     * @return
     */
    public static Object factory(Object obj) {
        //获取传入对象的Class对象
        Class<?> classType = obj.getClass();

        //生成代理对象并返回
        //该对象实现传入对象所实现的接口
        //生成的代理对象的所有方法都由第三个参数的invoke方法来接管和调用
        return Proxy.newProxyInstance(classType.getClassLoader(), classType
                .getInterfaces(), new ObjectDynamicProxy(obj));
    }
}

public class Client {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        
        //通过代理对象生成工厂生成该代理对象
        List list = (List)ObjectDynamicProxy.factory(new ArrayList());
        
        list.add("hello");
    }
}
复制代码

 

区别:

代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。
  先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
  代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。
  由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。
  具体例子可参看Java IO装饰/Spring的动态代理/Hibernate的代理等

用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,常常在一个代理类中创建一个对象的实例。
但是当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

 

需要理解更细的区别,我觉得这篇博客写的不错:

http://www.cnblogs.com/onlywujun/archive/2013/03/28/2985887.html

可以看看。

 

适配器模式,装饰模式,代理模式异同

http://blog.csdn.net/lulei9876/article/details/39994825

 

另外学习设计模式的基础知识为:

http://uule.iteye.com/blog/2078935

http://blog.csdn.net/tianhai110/article/details/6339565

 

posted on   pony1223  阅读(636)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示