抽象類:強(qiáng)調(diào)的是把共同(共有、相同)的屬性方法, 抽象出來(lái),統(tǒng)一寫在一個(gè)地方(他們的實(shí)現(xiàn)代碼是一樣的),方便維護(hù)。(面向?qū)ο笕筇匦灾械睦^承特性)
接口: 抽象的是行為 - 同一種行為的不同實(shí)現(xiàn)方式。當(dāng)多個(gè)對(duì)象都擁有相同的行為,但是行為的具體實(shí)現(xiàn)方式不一樣的時(shí)候可以用接口抽象(面向?qū)ο笾械亩鄳B(tài)特性)
所以一般在實(shí)際項(xiàng)目中接口和抽象類是配合使用而不是相互替代
例如:
所有的訂單都有單號(hào),單價(jià),數(shù)量。都擁有,而且相同,所以可以用一個(gè)抽象類給統(tǒng)一描述出來(lái)。
public abstract class AbstractOrder {
private String serialNo; // 單號(hào)
private Double money;? // 單價(jià)
private int number;? // 數(shù)量
}
再有一個(gè)商品訂單 還有一個(gè)獨(dú)有的 商品名稱 屬性。所以 在新新建一個(gè) ProductOrder 繼承 AbstractOrder
public class ProductOrder extends AbstractOrder{
private String productName;
}
另外 所有的訂單都需要支付,但是支付方式又不一樣比如,微信支付,支付寶支付,同一種行為,但是具體的行為方式又不一樣。所以用一個(gè)接口給抽象出來(lái)(規(guī)定一個(gè)行為標(biāo)準(zhǔn))
public interface PayWay {
public boolean pay();
}
public class WeixinPayWay implements PayWay{
@Override
public boolean pay() {
System.out.println("微信支付成功");
return false;
}
}
public class ZhifubaoPayWay implements PayWay{@Overridepublic boolean pay() {System.out.println("支付寶支付成功");return false;}}
因?yàn)樗杏唵味夹枰Ц?所以 只需要 改造?AbstractOrder 類在里面增加一個(gè) 支付行為
public abstract class AbstractOrder {
private String serialNo; // 單號(hào)
private Double money;? // 單價(jià)
private int number;? // 數(shù)量
private PayWay payWay;? // 支付行為
}
在比如 ?每種支付方式 支付之前都需要校驗(yàn)一下支付金額是不是真確的,不能小于等于0 。因?yàn)樾r?yàn)方式,校驗(yàn)代碼都是一樣的,所以我們可以定義一個(gè) 抽象類給抽象出來(lái)
public abstract class AbstractPayWay implements PayWay{
private Double money;
private boolean verify(){
return ?money != null && money > 0;
}
/***
?這里實(shí)現(xiàn)了 ?PayWay 中的 ?pay 接口 方法 所以 AbstractPayWay 的子類 無(wú)需 實(shí)現(xiàn)該 方法,
* 只需要 實(shí)現(xiàn) doPay() 方法,并且 如果 ?doPay()方法被成功調(diào)用則說(shuō)明肯定 校驗(yàn)成功了。
*/
@Overridepublic boolean pay(){
boolean verify = this.verify();
if(!verify){
System.out.println("支付金額驗(yàn)證錯(cuò)誤!");
return false;
}
return this.doPay();
}
public abstract boolean doPay();
}
所以 ?WeixinPayWay ?ZhifubaoPayWay 支付的具體實(shí)現(xiàn)類可以改改為
/**
* 繼承? AbstractPayWay 所以無(wú)需 寫公共的校驗(yàn)邏輯,直接寫支付業(yè)務(wù)邏輯
* @author cyy
*/
public class WeixinPayWay extends AbstractPayWay{
@Override
public boolean doPay() {
System.out.println("這里無(wú)需校驗(yàn)支付金額,直接調(diào)用支付方法就行");
System.out.println("微信支付成功");
return false;
}
}
public class ZhifubaoPayWay extends AbstractPayWay{
@Override
public boolean doPay() {
System.out.println("這里無(wú)需校驗(yàn)支付金額,直接調(diào)用支付方法就行");
System.out.println("支付寶支付成功");
return true;
}
}