设计模式
来源:互联网 发布:百度推广搜索合作网络 编辑:程序博客网 时间: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了一个原始类的对象出来。从代码上看很类似
。但是要理解其中概念和理念上的差距。
装饰模式:对原由的类进行装饰,新增或者修改一些具体实现。
代理模式:仅仅是将原有的类进行封装,只抛出一个代理,来处理原有的类,并没有对原来的类进行任何修改。
其实我的理解也不是很深,而且也不一定描述的完整和正确,请各位大神指正,谢谢~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 开发某个APP用到的开源框架
- mysql 单机多实例(二)
- Android蜘蛛网图/雷达图
- mysql索引
- springboot scheduled 异步执行
- 设计模式
- Object Detection论文笔记(2)
- 设置session验证码有效时间,定时删除session中的验证码
- 原型模式
- 数据库双机热备份
- 免费和开源的动图gif工具,没广告!效率高,体积小,精通18国语言,必备良品!!!
- 获取微信公众平台的用户openid
- 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式
- pomelo(五) Tutorial 2 Treasures