`

Java 设计模式-装饰器模式和代理模式

阅读更多

1.装饰器模式

1.1 定义

动态地给对象添加新的功能,相比子类继承方式有更大的灵活性。比如Java中的InputStream,使用了BufferedInputStream进行了包装实现了buffer data的功能。

 

使用装饰器模式,符合Open-Closed 原则,对修改封闭,对扩展(增加)开放。

 

1.2 使用场景

装饰器模式适用于完成类似的功能

 


2.代理模式

2.1 定义

有时候,我们需要对实际对象的访问进行控制,我们对这个层的访问进行重新封装成一个新的对象,让客户端直接访问这个新的对象。

 

2.2 使用场景

1.代理一些开销比较大的对象,可以实现延时加载

2.安全控制,缓存对象,异常处理,记录日志等等

3.分布式对象访问控制,使得客户端对象可以像访问本地服务一样访问远程服务

 

2.3 静态代理

静态代理类似于装饰器模式

 

package proxy;
/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-5
 *
 **/

public interface UserManager {
    public void addUser(String userName);
}

 

package proxy;
/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-5
 *
 **/

public class UserManagerImple implements UserManager {
    public void addUser(String userName){
         System.out.println(" do add user ... "+userName);
    }
}

 

package proxy;
/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-5
 *
 **/

public class StaticProxy implements UserManager {
    private UserManager userManager;
   
    public StaticProxy(UserManager userManager){
        this.userManager = userManager;
    }
   
    public void addUser(String userName){
        System.out.println("Static proxy here");
        userManager.addUser(userName);
    }

}

 

package proxy;
/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-5
 *
 **/

public class StaticProxyTest {
   
    public static void main(String[] args) {
        UserManager userManager = new UserManagerImple();
        UserManager userManagerProxy = new StaticProxy(userManager);
        userManagerProxy.addUser("Tommy");
    }

}

 

2.4 动态代理

动态代理只能代理接口,而且可以代理不同的接口,例如如果要在所有的类方法执行过程中,执行权限控制,只要在代理的代理方法中,传入不同的接口就可以实现,动态代理可以代理所有的方法。而静态代理只能在每个方法中加入权限控制代码,因此,动态代理的扩展性和代码的侵入性更小。

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-5
 *
 **/

public class DynamicProxy  implements InvocationHandler{
    private Object object;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("Put other functions here");
        return method.invoke(object, args);
    }
    public Object newProxy(Object object){
        this.object = object;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }
}
package proxy;
/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:Cisco CAS</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-5-5
 *
 **/

public class DynamicProxyTest {
   
    public static void main(String[] args) {
        DynamicProxy proxy = new  DynamicProxy();
        UserManager userManager= new UserManagerImple();
        UserManager userManager1 = (UserManager)proxy.newProxy(userManager);
        userManager1.addUser("Tommy");   
    }
}

 

3.两种设计模式之间的区别和联系

分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    JAVA设计模式-chm版

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式(Composite)、享元模式(Flyweight)和代理模式(Proxy)。这些模式可以帮助我们更好地组织代码,实现...

    Java设计模式----通俗易懂版

    Java设计模式是软件工程中的一种重要思想,它总结了在解决特定问题时,程序员们反复使用的一些最佳实践和解决方案。这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者...

    JAVA设计模式--程序设计--反射--注解--泛型

    设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...

    java设计模式的应用

    ### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...

    JAVA设计模式-原则和23种设计模式归纳总结

    本资源主要介绍了JAVA设计模式的原则和23种设计模式的总结。设计模式是软件设计中的一种解决方案,能够使软件系统更加灵活、可维护和可扩展。本资源首先介绍了设计模式的六大原则,包括单一责任原则、开闭原则、里氏...

    设计模式-Java语言中的应用

    设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...

    java设计模式-图解-附代码

    ### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...

    JAVA设计模式---100%推荐

    结构型模式关注如何将类或对象组合成更大的结构,比如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)和桥接(Bridge)模式。行为型模式则关注对象之间的通信和职责分配,如观察者(Observer)、模板方法...

    java与模式-阎宏

    3. 结构型模式:包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。这些模式关注于如何组织类和对象,以提高系统的灵活性和可扩展性。 4. 行为型模式:包括职责链模式、命令模式、解释...

    54-Spring设计模式之装饰器模式1

    * 代理模式:代理模式和装饰器模式类似,但是代理模式更关心的是控制原有对象的访问,而不是添加新的行为或功能。 * 适配器模式:适配器模式是用于解决不兼容的问题,而不是添加新的行为或功能。 * 模板方法模式:...

    Java设计模式-

    Java设计模式主要分为三类:创建型模式、结构型模式和行为型模式。 1. **创建型模式**: - **工厂方法模式**:提供一个创建对象的接口,让子类决定实例化哪一个类,将对象实例化的责任推迟到子类。这样可以使得...

    Java设计模式-图解-附代码.doc

    在软件工程中,设计模式是一种被广泛接受的解决特定设计问题的...因此,深入学习和理解Java设计模式对于任何Java开发者来说都是至关重要的。通过文档中的图解和代码示例,读者可以更好地理解和掌握这些模式的实际应用。

    JAVA设计模式(java设计)

    Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...

    Java设计模式-图解-附代码

    Java设计模式是软件开发中的一种最佳实践,它们是解决常见问题的经验总结,旨在提高代码的可重用性、可维护性和可扩展性。本篇Java设计模式(疯狂Java联盟版)详细介绍了二十三种设计模式,包括创建型、结构型和行为...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    Java设计模式-23种设计模式详解

    Java设计模式详解 Java设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 设计模式的六大原则...

    2020版23种Java设计模式-图解-附代码.pdf

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、可维护性和灵活性。本教程详细介绍了23种经典的Java设计模式,包括创建型、结构型和行为型模式。下面将对这...

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

    java设计模式-言情版

    7. **装饰器模式**:动态地给一个对象添加一些额外的职责,增加功能而不改变其原有结构。 8. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,可以用于延迟加载、权限控制等场景。 9. **桥接模式**...

Global site tag (gtag.js) - Google Analytics