Java——抽象类与模板设计模式
1.抽象类
抽象方法指的是只声明而未实现的方法(没有方法体)
抽象方法使用abstract关键字来定义,抽⽅方法所在的类也要使用abstract关键字来定义
抽象类:
- 不能直接产生实例化对象
- 如果一个非抽象类继承了抽象类,必须重写抽象类的方法
- 如果一个抽象类继承了抽象类,作为派生类的抽象类可以不实现最为基类的抽象类方法
- private、abstract和final不能同时出现
- 派生类的访问权限>=基类访问权限(方法重写时)
- 抽象类中可包含非抽象方法
abstract class Book{
private String name;
private int page;
public abstract void Name();
public abstract void Page();
}
class YuWen extends Book{
@Override
public void Name() {
System.out.println("语文书");
}
@Override
public void Page() {
System.out.println("共100页");
}
}
public class TestDemo {
public static void main(String[] args) {
YuWen yuwen = new YuWen();
yuwen.Name();
yuwen.Page();
}
}
2.模板设计模式
开闭原则(OCP): 一个软件实体如类、模块和函数应该对扩展开放、对修改关闭。
开闭原则是Java中最基础的设计原则。
模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供具体实现。
abstract class BankTemplate {
public final void takeNumber() {
System.out.println("取号");
}
public abstract void transact();
public final void evaluate() {
System.out.println("业务评价:");
}
final void process() {
takeNumber();
transact();
evaluate();
}
}
class Useer1 extends BankTemplate{
@Override
public void transact() {
System.out.println("取钱");
}
}
class Useer2 extends BankTemplate{
@Override
public void transact() {
System.out.println("存钱");
}
}
public class TestDemo1 {
public static void main(String[] args) {
Useer1 useer1 = new Useer1();
useer1.process();
Useer2 useer2 = new Useer2();
useer2.process();
}
}
"钩子"方法:
超类中通常是默认实现
子类可以选择性的覆写此方法
子类覆写钩子函数,实现自定义功能
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;
abstract class OnlineShopping{
public final void browseGoods(){
System.out.println("浏览商品");
}
public final void selectGoods(){
System.out.println("选择商品");
}
public abstract void callService();
public final void computerPrice(){
System.out.println("结算");
}
public abstract void orderPay();
public abstract void sendService();
public final void shoOrder(){
System.out.println("查看订单");
}
final void Process() {
browseGoods();
selectGoods();
if (isCallService()) {
callService();
}
computerPrice();
orderPay();
sendService();
shoOrder();
}
public boolean isCallService(){
return true;
}
}
class Tb extends OnlineShopping{
@Override
public void callService() {
System.out.println("淘宝客服为您服务");
}
public String Answer(){
System.out.println("是否需要咨询客服? 需要:Y 不需要:N");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
return str;
}
public boolean isCallService(){
String str = Answer();
if(str.equals("Y")){
return true;
}
return false;
}
@Override
public void orderPay() {
System.out.println("支付宝支付");
}
@Override
public void sendService() {
System.out.println("顺丰快递");
}
}
public class TestDemo2 {
public static void main(String[] args) {
Tb tb= new Tb();
tb.Process();
}
}