装饰者模式,适用于扩展类或添加新方法。是适配器模式的一种特殊的例子。
装饰者模式是is-a (1个usb接口扩展成4个usb接口,所实现的接口都是一样的)
适配器模式是has-a (usb接口转HTML接口,转VGM接口,所以适配器模式重点在于解决兼容问题)
public interface ISigninService {
public ResultMsg regist(String username,String password);
/**
* 登录的方法
* @param username
* @param password
* @return
*/
public ResultMsg login(String username,String password);
}
public class SigninService implements ISigninService {
public ResultMsg regist(String username,String password){
return new ResultMsg(200,"注册成功",new Member());
}
/**
* 登录的方法
* @param username
* @param password
* @return
*/
public ResultMsg login(String username,String password){
return null;
}
}
public interface ISigninForThirdService extends ISigninService {
public ResultMsg loginForQQ(String openId);
public ResultMsg loginForWechat(String openId);
public ResultMsg loginForToken(String token);
public ResultMsg loginForTelphone(String telphone,String code);
public ResultMsg loginForRegist(String username,String password);
}
public class SigninForThirdService implements ISigninForThirdService {
private ISigninService service;
public SigninForThirdService(ISigninService service){
this.service = service;
}
@Override
public ResultMsg regist(String username, String password) {
return service.regist(username,password);
}
@Override
public ResultMsg login(String username, String password) {
return service.login(username,password);
}
public ResultMsg loginForQQ(String openId){
//1、openId是全局唯一,我们可以把它当做是一个用户名(加长)
//2、密码默认为QQ_EMPTY
//3、注册(在原有系统里面创建一个用户)
//4、调用原来的登录方法
return loginForRegist(openId,null);
}
public ResultMsg loginForWechat(String openId){
return null;
}
public ResultMsg loginForToken(String token){
//通过token拿到用户信息,然后再重新登陆了一次
return null;
}
public ResultMsg loginForTelphone(String telphone,String code){
return null;
}
public ResultMsg loginForRegist(String username,String password){
this.regist(username,null);
return this.login(username,null);
}
}
===============================================================------
装饰器模式 | 适配器模式
-----------------------------------+---------------------------------
是一种非常特别的适配器模式 | 可以不保留层级关系
-----------------------------------+---------------------------------
装饰者和被装饰者都要实现同一个接口 | 适配者和被适配者没有必然的层级联系
主要目的是为了扩展,依旧保留OOP关系 | 通常采用代理或者继承形式进行包装
-----------------------------------+----------------------------------
满足is-a的关系 | 满足has-a
-----------------------------------+----------------------------------
注重的是覆盖、扩展 | 注重兼容、转换
-----------------------------------+----------------------------------