#头条公开课繁星计划# #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进行处理,非常感谢!