软件编程也要懂“面像”?错!是懂4个“面向”

#头条公开课繁星计划# #Java#

软件设计方法主要包括面向过程编程、面向对象编程OOP、面向接口编程和面向切面编程AOP。面向过程编程因其不利于超大规模系统设计,被逐渐淡出历史舞台,取而代之的是面向对象编程OOP、面向接口编程和面向切面编程AOP。这三个方法相辅相成,不会谁代替谁。

这4中编程设计方法有什么区别和联系呢?下面详细讲解:

如下图所示,我们以淘宝 购物为例,并用Java代码来模拟功能的实现。这里为了明白原理,把问题简单化,我们只考虑淘宝 购物过程的四个步骤:

3.1、逛淘宝搜索Java编程

3.2、挑选合适的书

3.3、下单

3.4、付款

1、面向过程编程POP(Procedure Oriented Programming)

面向过程编程以具体的一步一步实现过程为单位,关注过程的具体实现。面向过程解决问题时,会把该问题拆分为若干个步骤,然后按照一定顺序执行完这些步骤,该问题就解决了。面向过程是一种自顶向下的编程。C语言就是面向过程语言的典型代表。

举例:

用面向过程编程思想解决淘宝 购物这个实际问题,就会把该问题分解为有先后顺序的四个步骤:

3.1、逛淘宝搜索Java编程

3.2、挑选合适的书

3.3、下单

3.4、付款

这四个步骤是不能颠倒顺序的,必须依次执行;也不能只执行其中的某几个步骤。

Java代码模拟淘宝 购物过程的四个步骤:

public void BuySomethingByPOP {

System.out.println(“模拟淘宝 购物过程的四个步骤:”);

System.out.println(“3.1、逛淘宝搜索Java编程”);

System.out.println(“3.2、挑选合适的书”);

System.out.println(“3.3、下单”);

System.out.println(“3.4、付款”);

}

运行效果图:

面向过程编程缺点

不易维护、不易复用、不易扩展。

2、面向对象编程OOP(Object Oriented Programming)

面向对象编程以对象为单位,关注对象的属性和方法。面向对象解决问题时,把问题抽象成若干个对象,每个对象具有自己特有的一些属性和方法,每个对象执行自己的方法,该问题就解决了。Java、C#、C++、Delphi等都是面向对象语言的典型代表。也是现在最主要的软件设计方法。

2.1、面向对象编程的三大特性

2.1.1、封装

封装是面向对象编程语言对现实世界的模拟,现实世界的属性都隐藏在对象内部,外界是无法直接操作和修改的,仅对外公开访问接口,以便控制属性的读写的访问权限。

封装的作用是隐藏实现细节和限制不合理的操作。这样既了保护对象的属性,又提高了软件系统的可维护性。

2.1.2、继承

继承机制允许创建分层次的类。继承就是子类继承父类的特征和行为,即子类具有父类的行为。即使用现有类的所有功能,无需重新编写这些功能。人类的继承关系如下图所示:

2.1.3、多态

多态同一个行为具有多个不同表现形式或形态的能力,即指一个类实例(对象)的相同方法在不同情形有不同表现形式。

2.2、类图

类可以用类图形象直观的表达出来。比如人的类图如下图所示:

2.3、举例

运行效果:

具体实现:

//类文件Customer.java

package com.itexample.codes;

public class Customer {

// 属性

private String name;// 姓名

private int age;// 年龄

//封装

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

// 行为

public void BuySomething() {

System.out.println(“我是” + name + “顾客, 龄”+age +”年了。”);

System.out.println(“模拟淘宝 购物过程的四个步骤:”);

System.out.println(“3.1、逛淘宝搜索Java编程”);

System.out.println(“3.2、挑选合适的书”);

System.out.println(“3.3、下单”);

System.out.println(“3.4、付款”);

}

}

//使用顾客Customer类的代码

Customer customer = new Customer();//创建类

customer.setName(“iT例史”);//指定顾客姓名

customer.setAge(10);//指定顾客 龄

customer.BuySomething();//调用类的购物方法

3、面向接口编程IOP(Interface Oriented Programming)

面向接口编程的系统设计规范是定义(规范或约束)与该定义的实现分离。即对扩展开放,对修改关闭。

面向接口编程的主要思想是:

面向对象系统中,各种功能由不同对象协作完成。系统设计人员不太关心这些对象内部是如何实现自己的,而是重点关注对象间的协作关系。比如类间通信、模块间交互等等,都是系统设计的主要内容。

接口的本身反映了系统设计人员对系统的抽象理解。

面向接口编程的优势:

  • 降低程序的耦合性。
  • 程序中紧密联系并不是一件好的事情,因为联系越紧密,更换其中一个的难度就越大,扩展功能和debug的难度也越大。

  • 易于程序的扩展。
  • 有利于程序的维护。

  • 具体实现:

    定义接口文件ICustomer.java

    package com.itexample.codes;

    public interface ICustomer {

    // 定义方法/行为规范

    public void BuySomething();

    }

    实现接口类1:CustomerA.java

    package com.itexample.codes;

    public class CustomerA implements ICustomer {

    // 属性

    private String name;// 姓名

    private int age;// 年龄

    // 封装

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    //构造方法

    public CustomerA() {

    }

    //实现接口中定义的方法

    @Override

    public void BuySomething() {

    System.out.println(“我是” + name + “顾客, 龄” + age + “年了。”);

    System.out.println(“模拟淘宝 购物过程的四个步骤:”);

    System.out.println(“3.1、逛淘宝搜索Java编程”);

    System.out.println(“3.2、挑选合适的书”);

    System.out.println(“3.3、下单”);

    System.out.println(“3.4、付款”);

    }

    }

    实现接口类2:CustomerB.java

    package com.itexample.codes;

    public class CustomerB implements ICustomer {

    public CustomerB() {

    }

    @Override

    public void BuySomething() {

    System.out.println(“模拟淘宝 购物过程的四个步骤:”);

    System.out.println(“3.1、逛淘宝搜索Java编程”);

    System.out.println(“3.2、挑选合适的书”);

    System.out.println(“3.3、下单”);

    System.out.println(“3.4、付款”);

    }

    }

    //使用类

    CustomerA customera = new CustomerA();

    customera.setName(“iT例史”);

    customera.setAge(10);

    customera.BuySomething();

    4、面向切面编程AOP(Aspect Oriented Programming)

    面向切面编程AOP,通过运行期动态代理实现程序功能的统一维护。AOP是OOP的补充和完善,其剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并命名为切面Aspect,与具体的业务无关。其关注的是兄弟类间的横向关系,而OOP关注的是具有父子类间的纵向关系。

    使用AOP可以降低耦合度,提高程序的可重用性和开发效率。

    具体实现:

    接口ICustomer.java

    package com.itexample.codes.aop;

    public interface ICustomer {

    // 定义方法/行为规范

    public double BuySomethingLog(double pay);//定义购买日志记录

    }

    实现接口CustomerA.java

    package com.itexample.codes.aop;

    public class CustomerA implements ICustomer {

    //实现接口功能

    public CustomerA() {

    }

    //实现购买日志记录

    @Override

    public double BuySomethingLog (double pay) {

    System.out.println(“[购买日志]模拟淘宝 购物过程的四个步骤:”);

    System.out.println(“3.1、逛淘宝搜索Java编程”);

    System.out.println(“3.2、挑选合适的书”);

    System.out.println(“3.3、下单”);

    System.out.println(“3.4、付款”);

    //返回应付款

    return pay;

    }

    }

    切面BuyAspect.java

    package com.itexample.codes.aop;

    @Component

    @Aspect//切面注解

    public class BuyAspect {

    @AfterReturning(value=”execution(public void com.itexample.codes.aop.ICustomer.BuySomething())”,result=”result”)

    public AfterBuying(JoinPoint joinpoint,Object result) {

    String methodName = joinpoint.getSignature().getName();

    List<Object> args = Arrays.asList(joinpoint.getArgs());

    System.out.println(“淘宝 购物应付款:” + args.get(1));

    }

    }

    配置文件beans-aop.xml

    <context:component-scan base-package=”com.itexample.codes.aop”>

    </context:component-scan>

    <aop:aspect-autoproxy></aop:aspect-autoproxy>

    测试代码

    //创建Spring容器

    ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans-aop.xml”);

    //从IOC中获得bean

    ICustomer customer = ctx.getBean(ICustomer.class);

    double result = customer.BuySomething(2019);

    System.out.print(“淘宝 购物实付款:” + result );

    最后,总结一下。面向过程编程比面向对象编程性能高,因为类调用时实例化需要消耗资源,开销比较大,比如单片机、嵌入式等一般用面向过程开发。但面向对象易维护、易复用、易扩展。面向接口编程和面向切面编程都是面向对象编程的有益补充和完善。在系统设计时可以灵活运用,充分发挥各自的优点,做出更好的系统。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

  • 上一篇 2019年10月1日
    下一篇 2019年10月1日

    相关推荐