关于oop和aop

  • oop

oop(Object Oriented Programming)面向对象编程, oop的设计特征:封装, 继承, 多态, 抽象. OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性
oop强调了类之间的层次关系
举例说明, 男人女人都要吃饭, 所以可以抽象成一个人类(这个例子可能不是很好, 但我demo已经写好了,凑合看吧:))

public interface Person {
    String eat(String foodName);
}
public class Man implements Person {
    @Override
    public String eat(String foodName) {
        System.out.println(">>>>>>>>>>男人吧唧吧唧吃饭," + foodName);
        return "真香!";
    }
}
public class Woman implements Person {
    @Override
    public String eat(String foodName) {
        System.out.println(">>>>>>>>>>女人嚼嚼嚼吃饭," + foodName);
        return "真香!";
    }
}

如果我们要在吃饭的功能上加些东西呢, 无论男人女人都要饭前洗手, 饭后擦嘴. 可能就要这样写了

public class Woman implements Person {
    @Override
    public String eat(String foodName) {
        System.out.println(">>>>>>>>>>>>>饭前洗手");
        System.out.println(">>>>>>>>>>女人嚼嚼嚼吃饭," + foodName);
        System.out.println(">>>>>>>>>>>>>饭后擦嘴");
        return "真香!";
    }
}

男人那里也得改, 如果... 总之要在一个方法上附加相同功能, 每个实现都得改, 想想都手疼 :)

类似这样的情况同样会出现在我们编程中的很多地方,例如:日志记录、性能统计、安全控制、事务处理、异常处理等等。但是这样的情况该如何解决呢?这就引入了AOP编程思想。

  • aop

aop(Aspect Oriented Programming)面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
我们用aop实现的动态代理来完善上面的案例, 将方法里相同的功能抽取出来, 编写一个代理类实现InvocationHandler, 将洗手和擦嘴的动作分别放在invoke方法(吃饭,但不局限于吃饭)的前后

public class PersonProxy implements InvocationHandler {
    private Object targetObject;

    /**
     * 绑定委托对象并返回一个代理类
     * @param targetObject
     * @return
     */
    public Object createProxyInstance(Object targetObject) {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(),this);
    }

    /**
     * 执行方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 需要调用的方法
        washHand();
        Object result = method.invoke(targetObject, args);
        // 需要调用的方法
        wipeMouth();
        return result;
    }

    /**
     * 饭前洗手
     */
    private void washHand(){
        System.out.println(">>>>>>>>>>>>>饭前洗手");
    }

    /**
     * 饭后擦嘴
     */
    private void wipeMouth(){
        System.out.println(">>>>>>>>>>>>>饭后擦嘴");
    }
}

写一个main方法测试一下

public static void main(String[] args) {
        PersonProxy personProxy = new PersonProxy();
        Person woman = (Person)personProxy.createProxyInstance(new Woman());
        String age = woman.eat("egg");
        System.out.println(age);

        Person man = (Person) personProxy.createProxyInstance(new Man());
        String noodle = man.eat("noodle");
        System.out.println(noodle);
    }

结果如下图,也是我们想要的结果


最后, aop和oop的关系

OOP面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异

:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。