我们来看看这个问题:在已经实现的功能上如何再添加其他功能?如在一个类中有一个addUser方法,我们如何再实现这个逻辑之前加上其他逻辑!
实例代码:
//空的接口类public interface Father { //nothing}//需要添加逻辑的源代码public class UnChangeableClass implements Father {
public void addUser()
{
//在下面代码之前添加其他逻辑
System.out.println("add user success");
}}
方法一: (硬编码实现)我们可以在这个类中直接添加其他代码:比如我们可以这样写
缺点:是需要改变已有代码,不灵活,代码量大
public class UnChangeableClass implementsFather {
public void addUser()
{
otherFunction();//添加其他逻辑
System.out.println("add user success");
}
public void otherFunction()
{
System.out.println("add other functions");
}
}
方法二:(继承实现 is - a)我们可以再写一个类,让这个类继承上面的类,然后实现添加逻辑的功能, 在这个时候spring的配置就得改变为这个类
缺点:我们用了继承的方式,程序的耦合度提高,而且基本上每个有这样需求的类都得加一个新类,不灵活
public class Helper extends UnChangeableClass{
@Override
public void addUser()
{
//添加其他方法
otherFunction();
//调用父类的方法
super.addUser();
}
public void otherFunction()
{
System.out.println("add other functions");
}}
方法三:(组合实现 has a)我么重新写一个类,继承自该类的接口,让后组合这两个类--------其实这是一种java的静态代理
public class Helper2 implements Father {
// 将委托类组合到代理类(通过构造方法)
private UnChangeableClass target = null;
public Helper2(UnChangeableClass target) {
this.target = target;
// TODO Auto-generated constructor stub
}
public void otherFunction() {
// 添加的逻辑
System.out.println("Other funciton ");
// 委托类的逻辑
target.addUser();
}}
测试方法
public class Test {
public static void main(String [] args)
{
//委托类对象
UnChangeableClass target=new UnChangeableClass();
//代理类对象
Helper2 proxy =new Helper2(target);
//执行代理类方法(实际是在代理类中组合了委托类了代理类添加的方法)
proxy.otherFunction();
}
}