裝飾者模式(Decorator Pattern)是指在不改變原有對象的基礎(chǔ)之上,將功能附加到對象上烫葬,提供了比繼承更有彈性的替代方案(擴展原有對象的功能)界弧,屬于結(jié)構(gòu)型模式。
簡單的來說就是在原有的基礎(chǔ)上錦上添花
適用的場景
1、用于擴展一個類的功能或給一個類添加附加職責夹纫。
2咽瓷、動態(tài)的給一個對象添加功能设凹,這些功能可以再動態(tài)的撤銷舰讹。
代碼演示
@Data
public class Member {
private String username;
private String password;
private String mid;
private String info;
}
@Data
public class ResultMsg {
private int code;
private String msg;
private Object data;
public ResultMsg(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
}
//接口
public interface ISigninService {
//注冊
ResultMsg regist(String username, String password);
//登錄接口
ResultMsg login(String username, String password);
}
//實現(xiàn)類
public class SigninService implements ISigninService {
public ResultMsg regist(String username,String password){
return new ResultMsg(200,"注冊成功",new Member());
}
public ResultMsg login(String username,String password){
return null;
}
}
//繼續(xù)注冊和登錄接口,拓展他的功能
public interface ISigninForThirdService extends ISigninService {
ResultMsg loginForQQ(String id);
ResultMsg loginForWechat(String id);
ResultMsg loginForToken(String token);
ResultMsg loginForTelphone(String telphone, String code);
ResultMsg loginForRegist(String username, String passport);
}
//實現(xiàn)拓展的接口
public class SigninForThirdService implements ISigninForThirdService {
private ISigninService signin;
public SigninForThirdService(ISigninService iSignin){
this.signin = signin;
}
public ResultMsg regist(String username, String passport){
return signin.regist(username,passport);
}
public ResultMsg login(String username,String passport){
return signin.login(username,passport);
}
public ResultMsg loginForQQ(String id) {
return null;
}
public ResultMsg loginForWechat(String id) {
return null;
}
public ResultMsg loginForToken(String token) {
return null;
}
public ResultMsg loginForTelphone(String telphone, String code) {
return null;
}
public ResultMsg loginForRegist(String username, String passport) {
return null;
}
}
//testing
public class DecoratorTest {
public static void main(String[] args) {
ISigninForThirdService signinForThirdService = new SigninForThirdService(new
SigninService());
signinForThirdService.loginForQQ("xdcdfswrwsdfssdfqsdf");
//為某個類實現(xiàn)動態(tài)增加或者覆蓋原有方法的情況闪朱,采用裝飾器模式
}
}
裝飾者模式最本質(zhì)的特征是將原有類的附加功能抽離出來月匣,簡化原有類的邏輯。
優(yōu)點
1奋姿、裝飾者是繼承的有力補充锄开,比繼承靈活,不改變原有對象的情況下動態(tài)地給一個對象
擴展功能称诗,即插即用萍悴。
2、通過使用不同裝飾類以及這些裝飾類的排列組合寓免,可以實現(xiàn)不同效果癣诱。
3、裝飾者完全遵守開閉原則袜香。
缺點
1撕予、會出現(xiàn)更多的代碼,更多的類蜈首,增加程序復(fù)雜性实抡。
2、動態(tài)裝飾時欢策,多層裝飾時會更復(fù)雜吆寨。