设计模式

来源:互联网 发布:百度推广搜索合作网络 编辑:程序博客网 时间:2024/05/16 06:14

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

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

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了一个原始类的对象出来。从代码上看很类似
。但是要理解其中概念和理念上的差距。

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

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

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

原创粉丝点击