老师串讲
思考:如何增强方法
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();
}
}