概念
定義一個(gè)操作中算法的骨架洞豁,將具體的操作延時(shí)到子類,在不改變結(jié)構(gòu)的情況下為可以修改具體的特定步驟铣墨,主要的實(shí)現(xiàn)原理是繼承
角色
- 抽象出方法的父類
- 具體實(shí)現(xiàn)的子類
利弊
利
- 代碼復(fù)用
- 反向的控制結(jié)構(gòu)
- 具體實(shí)現(xiàn)細(xì)節(jié)不改變父類結(jié)構(gòu)
弊
- 每個(gè)不同的實(shí)現(xiàn)都需要不同的子類弟灼,會(huì)導(dǎo)致系統(tǒng)變得龐大
demo
登錄的場(chǎng)景
抽象出方法的父類:
登錄一般都是要實(shí)現(xiàn)校驗(yàn)的步驟和消息推送,還有其實(shí)的例如日志記錄等徙缴,這類用了校驗(yàn)和消息推送作為登錄場(chǎng)景的必要步驟试伙,不同的登錄方法有不同的校驗(yàn)和不同的消息推送方式。
public abstract class Login {
/**
* @Title: login
* @Description: 登錄
* @param @return 設(shè)定文件
* @return Boolean 返回類型
* @throws
*/
public Boolean login(String userName,String password){
this.verify(userName, password);
this.verify(userName, password);
return true;
}
/**
* @Title: verify
* @Description: 校驗(yàn)
* @param @param userName
* @param @param password
* @param @return 設(shè)定文件
* @return Boolean 返回類型
* @throws
*/
public abstract Boolean verify(String userName,String password);
/**
* @Title:sendMessage
* @Description: 消息通知
* @param @param userName
* @param @param password
* @param @return 設(shè)定文件
* @return Boolean 返回類型
* @throws
*/
public abstract Boolean sendMessage(String userName,String password);
}
通多不同的方式有不同的實(shí)現(xiàn),子類將具體實(shí)現(xiàn)出來(lái)
支付寶的驗(yàn)證登錄方式
···
public class AliPayLogin extends Login {
@Override
public Boolean verify(String userName, String password) {
System.out.println("阿里第三方登錄校驗(yàn)");
return true;
}
@Override
public Boolean sendMessage(String userName, String password) {
System.out.println("阿里第三方登錄消息通知");
return true;
}
}
···
微信的登錄方式
···
public class WechatLogin extends Login {
@Override
public Boolean verify(String userName, String password) {
System.out.println("微信系統(tǒng)第三方校驗(yàn)");
return true;
}
@Override
public Boolean sendMessage(String userName, String password) {
System.out.println("微信系統(tǒng)第三方消息通知");
return true;
}
}
···
在是使用的時(shí)候完全可以服用login的代碼疏叨,這樣就做到代碼的復(fù)用潘靖,子類又可以擁有不同的實(shí)現(xiàn)。
···
public static void main(String[] args) {
Login login = new AliPayLogin();
login.login("test", "1111");
login = new WechatLogin();
login.login("test", "1111");
}
···