2021-08-17

老师串讲

思考:如何增强方法

public class Dog {
    public void eat(){
        System.out.println("狗正在啃骨头");
    }
    public void bark(){
        System.out.println("狗正在汪汪汪的叫");
    }

}

方法一:修改源代码

public class Dog 
   public void eat(){
        System.out.println("eat方法增强开始");
        System.out.println("狗正在啃骨头");
        System.out.println("eat方法增强结束");
    }
    public void bark(){
        System.out.println("bark方法增强开始");
        System.out.println("狗正在汪汪汪的叫");
        System.out.println("bark方法增强结束");
    }
}

修改源代码的弊端,如果类比较多,修改起来比较麻烦

方法二:使用继承

改进可以使用继承

public class DogSon extends Dog{
    public void eat(){
        System.out.println("eat方法增强开始");
        System.out.println("狗正在啃骨头");
        System.out.println("eat方法增强结束");
    }
    public void bark(){
        System.out.println("bark方法增强开始");
        System.out.println("狗正在汪汪汪的叫");
        System.out.println("bark方法增强结束");
    }
}

测试类

public class TestDog {
    public static void main(String[] args) {
        Dog dog = new DogSon();
        dog.eat();
        dog.bark();
    }
}

运行结果:
增强eat方法开始
狗正在啃骨头
增强eat方法结束
增强bark方法开始
狗正在啃骨头
增强bark方法结束

方法三:装饰模式

过滤流使用了装饰模式
装饰模式的实现步骤:
1)定义一个接口

public interface Animal {
    void eat();
    void bark();
}

2)定义一个Dog类实现该接口

public class Dog implements Animal{
    public void eat(){
        System.out.println("狗正在啃骨头");
    }
    public void bark(){
        System.out.println("狗正在汪汪汪的叫");
    }

}

3)定义装饰类

public class ZhuangShi implements Animal{
    private Animal animal;
    //通过构造方法被装饰的对象
    public ZhuangShi(Animal animal) {
        this.animal = animal;
    }
    public void eat() {
        System.out.println("eat方法增强开始");
        animal.eat();
        System.out.println("eat方法增强结束");
    }
    public void bark() {
        System.out.println("bark方法增强开始");
        animal.bark();
        System.out.println("bark方法增强结束");
    }
}

测试类

public class TestZhuangShi {
    public static void main(String[] args) {
        Dog dog = new Dog();
//        ZhuangShi zs = new ZhuangShi(dog);

        Cat cat = new Cat();
        ZhuangShi zs = new ZhuangShi(cat);
        zs.eat();
        zs.bark();
    }
}

代理模式

静态代理


public class DaLi implements Animal{
    private Animal animal = new Dog();

    public void eat() {
        System.out.println("增加方法开始");
        animal.eat();
        System.out.println("增强方法结束");
    }

    public void bark() {
        System.out.println("增强方法开始");
        animal.bark();
        System.out.println("增强方法结束");
    }
}

测试类

public class TestDaLi {
    public static void main(String[] args) {
        DaLi dali = new DaLi();
        dali.eat();
        dali.bark();
    }
}
  • 装饰模式对构造方法传入的对象进行增强;
  • 代理模式隐藏了真实的对象,用户无需关心真实对象,通过操纵代理对象实现对真实对象方法的增强

动态代理

实现方式:两种使用java提供的类和CGLIB
实现方式一:使用Proxy类实现

//使用java提供的Proxy类完成动态代理
public class TestProxy {
    public static void main(String[] args) {
        Dog dog = new Dog();
        //创建代理对象
        //第一个参数真实对象对应类的类加载器
        //第二个参数表示真实对象实现了哪些接口
        Animal animal = (Animal) Proxy.newProxyInstance(dog.getClass().getClassLoader(),
                dog.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    //第一个参数代理对象,第二个参数方法对象,第三个参数方法参数对象
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if ("eat".equals(method.getName())) {
                            System.out.println("增强eat方法开始");
                            dog.eat();
                            System.out.println("增强eat方法结束");
                        } else if ("bark".equals(method.getName())) {
                            System.out.println("增强bark方法开始");
                            dog.bark();
                            System.out.println("增强bark方法结束");
                        }
                        return null;
                    }
                });
        animal.eat();
        animal.bark();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值