設計模式:介面卡模式和裝飾器模式
package study.design.adapter.pass;
import study.design.adapter.ResultMsg;
/**
* @comment 原介面
* @author bin
* @date 2018年8月2日
*/
public interface SignService{
public ResultMsg signIn(String userName,String passWord) ;
public ResultMsg signUp(String userName,String passWord) ;
}
package study.design.adapter.pass; import study.design.adapter.ResultMsg; /** * * @comment 原方法 * @author bin * @date 2018年8月2日 */ public class SignServiceImpl implements SignService{ @Override public ResultMsg signUp(String userName, String passWord) { return new ResultMsg(200, userName, "註冊成功"); } @Override public ResultMsg signIn(String userName, String passWord) { return new ResultMsg(200, userName, "登入成功"); } }
package study.design.adapter.pass; import study.design.adapter.ResultMsg; /** * @comment 第三方登入實現服務 * @author bin * @date 2018年8月2日 */ public class ThridSignServiceImpl extends SignServiceImpl{ @Override public ResultMsg signUp(String userName, String passWord) { // TODO Auto-generated method stub return super.signUp(userName, passWord); } @Override public ResultMsg signIn(String userName, String passWord) { // TODO Auto-generated method stub return super.signIn(userName, passWord); } /* * 新增QQ登入 */ public ResultMsg QQSignIn(String userName) { return new ResultMsg(200,userName,"QQ登入成功"); } }
package study.design.adapter.pass; /** * 介面卡模式 * @comment * 需求:在不改變原有登入註冊等業務場景下 新增第三方登入 * 理解:在未改動原有服務實現的情況下 增加新的方法 * 實現方式:繼承原有服務 新增方法 * @author bin * @date 2018年8月2日 */ public class ThirdSignTest { public static void main(String[] args) { //原註冊登入的方式 SignService sign=new SignServiceImpl(); String userName="使用者名稱"; String passWord="密碼"; sign.signIn(userName, passWord); sign.signUp(userName, passWord); //擴充套件第三方登入後方式 ThridSignServiceImpl thrdSign = new ThridSignServiceImpl(); thrdSign.signIn(userName, passWord);//原登入方法還可以使用 thrdSign.signUp(userName, passWord);//原註冊方法還可以使用 thrdSign.QQSignIn(userName);//新增的QQ登入 } }
package study.design.decorator.pass;
import study.design.adapter.ResultMsg;
/**
* @comment 第三方登入實現服務
* @author bin
* @date 2018年8月2日
*/
public class ThridSignServiceImpl implements ThridSignService{
SignService signService;
public ThridSignServiceImpl(SignService signService) {
this.signService=signService;
}
@Override
public ResultMsg signIn(String userName, String passWord) {
// TODO Auto-generated method stub
return signService.signIn(userName, passWord);
}
@Override
public ResultMsg signUp(String userName, String passWord) {
// TODO Auto-generated method stub
return signService.signUp(userName, passWord);
}
@Override
public ResultMsg QQSignIn(String userName) {
return new ResultMsg(200,userName,"QQ登入成功");
}
}
===============================================================------
裝飾器模式 | 介面卡模式
-----------------------------------+---------------------------------
是一種非常特別的介面卡模式 | 可以不保留層級關係
-----------------------------------+---------------------------------
裝飾者和被裝飾者都要實現同一個介面 | 適配者和被適配者沒有必然的層級聯絡
主要目的是為了擴充套件,依舊保留OOP關係 | 通常採用代理或者繼承形式進行包裝
-----------------------------------+----------------------------------
滿足is-a的關係 | 滿足has-a
-----------------------------------+----------------------------------
注重的是覆蓋、擴充套件 | 注重相容、轉換
-----------------------------------+----------------------------------
介面卡實現方式:繼承該類並擴充套件即可
裝飾器模式:實現介面,並在定義的裝飾器中宣告介面並定義引數為介面的構造方法