美文网首页
关于oop和aop

关于oop和aop

作者: 朝生夕丧 | 来源:发表于2019-01-22 16:12 被阅读14次
  • 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则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异

:)

相关文章

  • 关于oop和aop

    oop oop(Object Oriented Programming)面向对象编程, oop的设计特征:封装, ...

  • 02 Spring的AOP(面向切面编程)

    1、关于AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(...

  • aop概念

    (1)oop与aop的区别: oop是面向对象编程,aop是面向切面编程或者面向方面编程.. (2)aop的用处和...

  • Spring AOP篇

    一、什么是AOP? AOP(Aspect Oriented Programming)面向切面编程。 AOP和OOP...

  • AOP

    AOP是OOP的延续和补充。

  • Spring AOP简介

    为什么需要AOP? AOP(面向切面编程)和OOP(面向对象编程)一样,也是一种编程思想。具体来说,AOP是OOP...

  • iOS 实现AOP编程(Objective-C)

    iOS 实现AOP编程(Objective-C) 一、AOP与OOP OOP(Object Oriented Pr...

  • Android Aop编程总结之一引入AOP

    一.aop概念。 AOP 和 OOP面向对象的特点是继承、多态和封装。为了符合单一职责的原则,OOP将功能分散到不...

  • spring的AOP分析

    AOP的引入 AOP 面向切面编程。可以说是面向对象编程(OOP)的完善和补充。OOP引入了封装,继承,多态等概念...

  • 浅析 aop

    一、什么是aop? aop是面向切面编程。aop是oop的延续,oop的重点在于具体领域模型的抽象,而aop则是针...

网友评论

      本文标题:关于oop和aop

      本文链接:https://www.haomeiwen.com/subject/spaljqtx.html