添加属性和有用的接口

利用层叠的数个对象为单个对象动态地和透明地添加职责的方式,称作“修饰器”模式。(模
式1是Thinking in Patterns(用java)中讨论的主题,见www.BruceEckel.com)。修饰
器模式规定所有封装于初始对象内部的对象具有相同的接口。这使得修饰器的基本应用具有
透明性——我们可以向修饰过或没有修饰过的对象发送相同的消息。这正是Java I/O类库
里存在“filter”类的原因所在:抽象类“filter”是所有修饰类的基类。(修饰器必须具有和它所
修饰的对象相同的接口,但是修饰器也可以扩展接口,这种情况发生在几种“filter”类中)。


在直接使用扩展子类的方法时,如果导致产生了大量的、用以满足所需的各种可能性组合的
子类,这时通常就会使用修饰器——处理太多的子类已不太实际。Java I/O类库需要多种
不同性质的组合,这正是使用修饰器模式的理由所在2。但是,修饰器模式也有一个缺点:
在我们编写程序时,它给我们提供了相当多的灵活性(因为我们可以很容易地混合和匹配属
性),但是它同时也增加了我们代码的复杂性。Java IO类库操作不便的原因在于:我们必
须创建许多类——“核心”IO类型加上所有的修饰器——才能得到我们所希望的单个IO对
象。


FilterInputStream 和 FilterOutputStream 是提供给修饰接口用于控制特定输入流
(InputStream)和输出流(OutputStream)的两个类,它们的名字并不是很直观。
FilterInputStream 和 FilterOutputStream 自 I/O 类库中的基类——输入流
(InputStream)和输出流(OutputStream)衍生而来,这两个类是修饰器的必要条件

(以便能为所有正在被修饰的对象提供通用接口)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用CGLIB动态添加属性时,你可以通过以下步骤实现: 1. 创建一个需要被增强的类,该类无法直接添加属性。 2. 创建一个类来扩展`net.sf.cglib.proxy.MethodInterceptor`接口,用于拦截方法调用并进行增强操作。 3. 使用CGLIB库生成代理对象,将该代理对象作为原始对象的子类返回。 4. 在拦截器中,可以使用`net.sf.cglib.beans.BeanGenerator`来动态添加属性。 下面是一个简单示例代码: ```java import net.sf.cglib.beans.BeanGenerator; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class DynamicPropertyExample { public static class MyBean { public void printName() { System.out.println("Original method"); } } public static class PropertyInterceptor implements MethodInterceptor { private Object target; public PropertyInterceptor(Object target) { this.target = target; } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { if (method.getName().equals("getProperty")) { // 添加动态属性逻辑 // 实际应用中可根据需要进行属性添加和获取 return "Dynamic Property Value"; } return method.invoke(target, args); } } public static Object createDynamicPropertyObject() { BeanGenerator generator = new BeanGenerator(); generator.addProperty("propertyName", String.class); // 动态添加名为propertyName的String类型属性 return generator.create(); } public static void main(String[] args) { MyBean bean = (MyBean) createDynamicPropertyObject(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyBean.class); enhancer.setCallback(new PropertyInterceptor(bean)); MyBean proxyBean = (MyBean) enhancer.create(); proxyBean.printName(); // 调用原始方法 System.out.println(proxyBean.getProperty()); // 动态获取属性值 } } ``` 在这个示例中,我们使用`BeanGenerator`来动态添加一个名为`propertyName`的String类型属性。然后,我们使用`Enhancer`来创建代理对象,并将代理对象传递给自定义的拦截器`PropertyInterceptor`。在`PropertyInterceptor`中,我们拦截了`getProperty`方法的调用,并返回动态添加属性值。 请注意,这只是一个简单的示例代码,实际情况下你可能需要根据具体需求进行更复杂的操作。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值