Java语言之抽象类与接口

本文详细介绍了Java中的抽象类及其使用原则,包括抽象方法和抽象类的定义。接着讨论了模板设计模式,解释了其核心算法与子类延迟实现的原理。此外,还阐述了接口的概念、定义与使用,强调了接口优先的设计原则。最后,探讨了工厂设计模式,包括简单工厂、工厂方法和抽象工厂模式,以及代理设计模式的应用场景和工作原理。

抽象类

抽象类的定义与使用
抽象类只是在普通类的基础上扩充了一些抽象方法而已,所谓的抽象方法指的是只声明而未实现的方法(即没有方法体)。所有抽象方法要求使用abstract关键字来定义,并且抽象方法所在的类也一定要使用abstract关键字来定义,表示抽象类。
简单来说:抽象类就是普通类的超集,只是比普通类多了一些抽象方法而已。
范例:定义一个抽象类

abstract class Person{
private String name ; // 属性
public String getName(){ // 普通方法
return this.name;
}
public void setName(String name){
this.name = name ;
}
// {}为方法体,所有抽象方法上不包含方法体
public abstract void getPersonInfo() ; //抽象方法
}

抽象方法:使用abstract关键字定义的只有方法声明没有方法体的方法。
抽象类的使用原则:

  • 所有抽象类必须有子类(final与abstract关键字不能同时出现)
  • 抽象类的子类必须覆写所有抽象方法(或者子类也是用abstract关键字,private(无法被覆写)与abstract(必须被覆写)不能同时出现)
  • 抽象方法必须被覆写,抽象类无法产生实例化对象,但可以通过向上转型实例化。而且子类依然遵循对象实例化流程,先调用抽象类的构造方法而后在调用子类构造。抽象类还有单继承局限。
    范例:使用抽象类
abstract class Person{
private String name ; // 属性
public String getName(){ // 普通方法
return this.name;
}
public void setName(String name){
this.name = name ;
}
// {}为方法体,所有抽象方法上不包含方法体
public abstract void getPersonInfo() ; //抽象方法
}
class Student extends Person{
public void getPersonInfo(){
System.out.println("I am a student");
}
}
public class Test{
public static void main(String[] args) {
Person per = new Student() ; //实例化子类,向上转型
per.getPersonInfo() ; //被子类所覆写的方法
}
}

模板设计模式

五大设计原则:OCP原则(开闭原则)
一个软件实体如类,接口等应该对扩展开放,修改关闭
先找到第三方,找到第三方学会一半。
第三方:模板类,将核心算法与具体子类分离,子类只需要覆写某几步流程就好。

  • 模板设计模式—基于抽象类的设计模式
    在一个方法中定义一个方法的骨架(冲咖啡),而将一些步骤延迟到子类中实现
    优点:模板模式可以使得子类在不改变核心算法的基础上,具体实现算法中的某些步骤

  • 模板类的组成
    —final关键字修饰的核心算法 模板方法
    —abstract关键字修饰的抽象方法,延迟到子类 抽象方法
    —通用方法,所有都一样的方法 子类通用方法
    —钩子方法,默认不做事的方法,子类可以视情况而定是否需要覆写

接口的定义与使用

开发原则:
接口优先原则,在一个场景既可以使用接口也可以使用抽象类的时候,优先使用接口。
接口的基本概念:
接口就是抽象方法和全局变量的集合,在java中接口使用interface关键字定义。
范例:简单定义一个接口

interface IMessage{
public static final String MSG = "I am a biter" ; // 全局常量
public abstract void print() ; // 抽象方法
}

接口无法直接创建实例化对象,需要通过通过向上转型为其实例化 ;接口命名一般以I开头,子类使用impiements关键字实现接口,子类一般以impl结尾,表示此类事一个接口的子类
接口允许许多实现(多继承),一个子类可以同时使用implements实现若干个接口
接口使用限制
接口中只允许public权限,(不管属性还是方法)而且接口中abstract,final,static关键字均可以不写
当一个子类即需要实现接口又需要继承抽象类时,需要先使用extends继承一个抽象类,然后在使用implements实现多个接口。
接口不能实现继承抽象类,接口可以使用extends继承多个父接口关系
接口的应用场景——混合行为
1.定义操作标准
2.表示一种能力、行为

工厂设计模式

第三方:
工厂类,将客户端的产生对象与具体子类分离。提取到专门工厂类产生对象
简单工厂模式
没有工厂类时,用户无法便捷的得到产品
问题本质:主方法(客户端)直接与具体产品交换
——将客户端产生商品的行为提取到一个新的类中——工厂类
特点:
1.一个抽象产品类(computer)
2.多个具体的产品类(macbookpro)
3.一个工厂(负责生产所有产品,客户端与工厂交互,不与产品交互)
当多个具体产品出现家族式特征时,为了保证不同产品系之间的隐私,不同产品系有自己的工厂
工厂方法模式
1.一个抽象产品类象
2.多个具体的产品类
3.一个抽象工厂
4.多个具体工厂
抽象工厂模式
代理设计模式——代练 代购
第三方:代理类,将真实业务与辅助操作解耦(分离)(买电脑与出国排队,发快递解耦)
真实业务类
辅助类
特点:一个接口,两个子类。其中一个子类负责完成真实业务,另外一个辅助
代理类中:需要传入真实业务对象,代理需要知道真实客户是谁,完成真实业务是由真实对象完成,代理只需要辅助。(掏钱的是客户,并不是代购)通过构造方法传入(下订单时,商家已经知道客户是谁)
传入的是接口对象:只要是接口中定义的业务,代理都可以进行代理。(只要是买电脑,代购都可以处理,若传入真实类,则只能代购 具体品牌)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值