java类增强方式

我理解的增强类即是对类进行功能性扩展,除了网上常规的3种方法(

1、继承或者实现接口:特点是被增强对象不能变,增强的内容不能变。

2、装饰着模式:特点是被增强对象可变,但增强内容不可变。

3、动态代理:特点是被增强对象可变,增强内容可变。

)外,还应该包括如下几种方式:组合(根据设计模式思想组合应该优先于继承考虑)、内部类

 

组合:自身需增强类持有目标类对象

内部类:目标需增强类内部添加新类型,该新类型可以有继承或者实现行为

 

package com.test;

/**
 * 自身需增强类
 *
 * @author
 * @date 2019/4/6
 */
public class Extension {
    private Target target;//方式一:持有目标类对象
    public Extension(Target target) {
        this.target=target;
    }

    public Extension() {
    }

    public void action(){
        System.out.println("com.test.Extension.action");
    }

    public void action1(){
        target.before();
        action();
        target.after();
    }


    class Target1 extends Target{   //方式二:以内部类继承或者实现目标类

        public void action2(){
            before();
            action();//内部类可以访问外部类所有成员
            after();
        }

        @Override
        public void after() { //为了进一步扩大展示效果,改写目标类方法,也可使用原目标类方法
            System.out.println("com.test.Extension.Target1.after");
        }

        @Override
        public void before() {
            System.out.println("com.test.Extension.Target1.before");
        }
    }

}

 

 

 

 

package com.test;

/**
 * 目标类
 *
 * @author
 * @date 2019/4/6
 */
public class Target {
    public void before(){
        System.out.println("com.test.Target.before");
    }

    public void after(){
        System.out.println("com.test.Target.after");
    }
}

 

 

package com.test;

/**
 * 测试类
 * @author
 * @date 2019/4/6
 */
public class TestExtension {
    public static void main(String[] args) {
        Target target=new Target();
        Extension extension = new Extension(target);
        System.out.println("----------------增强前");
        extension.action();

        System.out.println("----------------增强后");
        extension.action1();

        System.out.println("\n----------------华丽的分割线----------------\n");

        Extension.Target1 target1 = extension.new Target1();
        System.out.println("----------------增强前");
        extension.action();

        System.out.println("----------------增强后");
        target1.action2();
    }
}

 

 运行结果:

----------------增强前
com.test.Extension.action
----------------增强后
com.test.Target.before
com.test.Extension.action
com.test.Target.after

----------------华丽的分割线----------------

----------------增强前
com.test.Extension.action
----------------增强后
com.test.Extension.Target1.before
com.test.Extension.action
com.test.Extension.Target1.after

 

总结:对类进行增强,本质上是在原有基础上添加新功能,无论是添加新引用,或者新内部类,都可以看做是通过添加新成员以达到扩展本类的目的。

 

最后:可能组合的模式和相应的设计模式有异曲同工的地方,但添加新成员以达到扩展任然不失为一种解决思路。仁者见仁智者见智,以技术交流为目的,有问题的地方欢迎大家交流指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值