设计模式 - 装饰模式 & 代理模式

通过学习了这两种模式,我发现这两种模式虽然在使用和理解上有一些差异,不过也有很多相同之处,故而将这两个模式放在同一篇文章中来记录我看到的内容。

首先来看看两种模式的解释:

1、装饰模式:对一个类进行装饰,对这个原始类进行扩展,需要新增一个装饰类对原始类进行装饰。

2、代理模式:对一个类进行封装,并不对外直接暴露,而是通过一个代理类,替代直接对原始类的操作。

个人理解的差异就是:装饰类,用户是知道我需要装饰的类是哪个,对用户是透明的;而代理类,直接就不给用户知道,用户知道的只是该类的一个代理类,对原始类的本身没有一个知情权。这一点差异,就是我理解的这两个模式的本质上的差异点。

通过这样的差异,我们通过代码来看一下这两个模式之间不一样的地方。

相同点,装饰类和被装饰类都需要实现同一个接口。代理类和被代理类也需要实现同一个接口

首先,老办法,写出两个都需要的部分:

ISource.java

package com;

public interface ISource {
    public void method();
}

原始类:Source.java

package com;

public class Source implements ISource {

    @Override
    public void method() {
        System.out.println("This is method from source Class");
    }
}



一、装饰模式

装饰模式,我要知道需要装饰的是什么对象,因此是这样写的。

Decorator.java

package com;

public class Decorator implements ISource {

    private Source source;

    public Decorator(Source source) {
        // TODO Auto-generated constructor stub
        this.source = source;
    }

    @Override
    public void method() {
        // TODO Auto-generated method stub
        System.out.println("before decorator!");
        source.method();
        System.out.println("after decorator!");
    }
}
测试类:

DecoratorTest.java

package com;

public class DecoratorTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Source source = new Source();
        Decorator decorator = new Decorator(source);
        decorator.method();
    }
}

二、代理模式

代理模式,完全隐藏了原始类的信息,暴露给外面的只有这个代理

Proxy.java

package com;

public class Proxy implements ISource {
    ISource source;

    public Proxy() {
        // TODO Auto-generated constructor stub
        this.source = new Source();
    }

    @Override
    public void method() {
        // TODO Auto-generated method stub
        importData();
        source.method();
        calcResult();
    }

    private void calcResult() {
        // TODO Auto-generated method stub
        System.out.println("This is import Data");
    }

    private void importData() {
        // TODO Auto-generated method stub
        System.out.println("This is clac result");
    }
}
测试类:

ProxyTest.java

package com;

public class ProxyTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ISource proxy = new Proxy();
        proxy.method();
    }
}



结论:

在代码结果上,两个模式非常类似,仅仅是装饰者模式需要装饰者需要持有原始类的对象,而代理模式是在代理模式中自己new了一个原始类的对象出来。从代码上看很类似
。但是要理解其中概念和理念上的差距。

装饰模式:对原由的类进行装饰,新增或者修改一些具体实现。

代理模式:仅仅是将原有的类进行封装,只抛出一个代理,来处理原有的类,并没有对原来的类进行任何修改。

其实我的理解也不是很深,而且也不一定描述的完整和正确,请各位大神指正,谢谢~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值