文档章节

设计模式之装饰,以及代理(proxy)的关系

bBugyang
 bBugyang
发布于 2014/05/14 01:15
字数 804
阅读 41
收藏 0

    装饰设计模式是23种设计模式的一种,英文曰Decorator Pattern(在我第一份工作的面试中,CTO曾问我装饰设计模式的英文是什么,很明显我没答上来)

    顾名思义,装饰模式就是将已存在的对象进行包装后,成为全新的对象,现在这个对象可以做的更好(更多)。装饰模式的特点如下:

    1,装饰对象和被装饰对象有相同的接口。这样,装饰对象就可以改变被装饰对象中的所有方法,并保持原有的方法名。

    2,装饰类中要维护一个类型为被装饰对象类型的成员。这样可以减少重复代码,对于不需要包装的方法,可以直接用该成员调用即可。

    简单上代码:

    被包装的类及其接口:

interface Phone {
    void call();
    void showTime();
    void runGame();
}

class NomalPhone implements Phone{
    public void call() {
        //TODO call sb.
    }
    public void showTime() {
        //TODO showTime.
    }
    public void runGame() {
        //TODO runGame.
    }
}

    包装类:

class SuperPhone implements Phone {
    //维护一个被装饰的对象。
    private Phone phone;
    
    SuperPhone(Phone phone) {
        this.phone = phone;
    }
    public void call() {
        //Do more more more..
    }
    public void showTime() {
        phone.showTime();
    }
    public void runGame() {
        phone.runGame();
    }
}

    这时你调用包装类的call方法,就会运用包装类的call方法,其他还用的被包装类的方法。这样就可以有目的的进行包装,以增强对象的功能。

    其实去看代码,代理和装饰是非常相似的。机制非常相似,都会引用一个原始对象,并对该对象进行些许操作。但是目的不同:装饰主要为增强对象,使对象有更强大的功能....而代理模式大多用于AOP中,对原有的对象进行限制,比如是否登录,是否为空等等。。

    下面补上关于动态代理的内容:

    动态代理类位于java.lang.reflect包下,可以看出,其运用了反射机制。首先动态代理的好处就在于其在方法很多的类中运用时可以省去很多代码,缺点嘛,反射机制效率多多少少会受影响。

    动态代理类需要实现InvocationHandler接口,该接口只定义了一个抽象方法invoke,共有3个参数,第一个为要代理的对象,第二个为类中方法,第三个为参数。先上代码:

class DynamicProxy implements InvocationHandler{
    private Phone phone;
    public DynamicProxy(Phone phone) {
        super();
        this.phone = phone;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
        if(method.getName().equals("call"))
            return null;
        return method.invoke(phone, args);
    }
}

最后上客户端类:

public class Decorator {
    public static void main(String[] args) {
        Phone phone = new NomalPhone();
        DynamicProxy dynamicProxy = new DynamicProxy(phone);
        Phone p = (Phone) Proxy.newProxyInstance(phone.getClass().getClassLoader(), phone.getCl                ass().getInterfaces(), dynamicProxy);
        p.call();
        p.runGame();
    }
}

这样如果有特别多的方法时,就可以轻松解决了。不需要实现每一个代理类的方法,所以还是很有用的。記住:

    

Phone p = (Phone) Proxy.newProxyInstance(phone.getClass().getClassLoader(), phone.getCl                ass().getInterfaces(), dynamicProxy);

    要强转的时候要注意,接受的类必须和参数中第二个参数相同或其子类才可。


© 著作权归作者所有

bBugyang
粉丝 0
博文 7
码字总数 2165
作品 0
东城
程序员
私信 提问
Java之23种设计模式解析(二)

B、结构模式(7 种) 我们接着讨论设计模式,上篇文章我讲完了 5 种创建型模式,这章开始,我将讲下 7 种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模...

wersdffg
2015/02/15
142
0
设计模式学习笔记之-代理模式

代理模式中,客户不会直接调用目标对象而是通过一个代码对象,客户调用代理对象代理对象去调用目标对象,起到对象与对象间的隔离作用。有时候我么不想直接访问目标对象,有时候我们不能直接访...

申文波
2018/03/05
114
0
设计模式的学习 总结(1)代理模式,适配器模式,外观模式和装饰器模式的异同

一、定义 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理类需要持有一个真实对象,用来对真实对象进行访问。 适配器模式(Adapter):将一个类的接口转换成客户希望...

杨健-YJ
2018/12/27
14
0
23种JAVA设计模式(3)-结构模式

B、结构模式(7种) 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...

Mr_蜗牛
2015/04/15
29
0
深入 JavaScript 设计模式,从此有了优化代码的理论依据

一、设计模式综述 我想很多和我一样的朋友小时候都看过《天龙八部》,里面的女主角王语嫣是个武学博才,但自己却毫无实战。比如段誉和慕容复交手时,她连连口述指导:"段郎,二龙爪手,抢珠三...

_呜啦啦啦火车笛
08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
58
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
61
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
57
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
58
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部