需求:增强原代码的部分功能或者新加功能,不对原代码进行修改。
第一种:继承
子类继承父类,在子类中对需要加强的方法进行逻辑重构,或者新加方法。
//需要加强的类
public class Person {
public void run(){
System.out.println("每小时5公里");
}
}
//加强后的类
public class Man extends Person{
@Override
public void run() {
System.out.println("每小时10公里");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Person m = new Man();
m.run();
}
}
第二种:修饰者模式
需要条件
1.有共同的接口,
2.装饰者要有被装饰者的对象, 因为不需要加强的功能可以直接调用复现,需要加强的可以重构方法的逻辑,以达到加强目的
//接口
public interface Person {
public void eat();
public void sleep();
public void run();
}
//接口的实现类,需要时保留吃饭和睡觉的功能不变,对run功能加强
public class Man implements Person {
@Override
public void eat() {
System.out.println("吃馒头");
}
@Override
public void sleep() {
System.out.println("睡大街");
}
@Override
public void run() {
System.out.println("每小时5公里");
}
}
//加强后的类,对接口进行实现,利用有参构造传递被加强类的对象,
//对不需要加强的方法直接调用,需要加强的重构逻辑。
public class SuperMan implements Person {
Person man;
public SuperMan(Person man) { //这里用接口接收对象,只要是实现这个接口的所有实现类都能接收到
this.man = man;
}
@Override
public void eat() {
man.eat();
}
@Override
public void sleep() {
man.sleep();
}
@Override
public void run() {
System.out.println("每小时10公里");
}
public void fly(){
System.out.println("超人会飞");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Man m = new Man();
SuperMan p = new SuperMan(m);
p.run();
p.fly();
}
}
第三种:动态代理
利用反射建立一个监听器, 筛选出来需要修改功能的方法进行改写方法逻辑,不需要修改的直接执行。
Proxy.newProxyInstance(参数1,参数2,餐数3)
参数1: 提供加载的字节码数据
参数2: 提供类实现的接口的信息
参数3: 对接口进行匿名调用
public class Test {
public static void main(String[] args) {
Man m = new Man();
//Proxy类中的newProxyInstance进行监听,这里用到的是反射
Person p = (Person) Proxy.newProxyInstance(m.getClass().getClassLoader(), m.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("run")) { //进行筛选方法,符合条件的重构方法
System.out.println("每天跑10公里");
return null;
} else {
return method.invoke(proxy, args);
}
}
});
p.run();
}
}