举个小例子:
//虽然DataInput功能强大,但是它同样是 InputStream
//满足 is a关系 。为了某个实现类在不修改原有类的基础上动态地覆盖或者增加方法。 适配器最重要是兼容。
//该实现类与原有类的层级关系,是一种特殊的适配器模式。
InputStream in=null;
FileInputStream fis=new DataInputStream(in);
代码:
decorator-old
package com.gupaoedu.decorator.old;
/**
* ClassName:ResultMsg
* PackageName:com.gupaoedu.adapter
* Description:
*
* @date:2020/7/20 21:14
* @author:robin
*/
public class ResultMsg {
private String code;
private String msg;
private Object data;
public ResultMsg(String code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "ResultMsg{" +
"code='" + code + '\'' +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
package com.gupaoedu.decorator.old;
/**
* ClassName:Member
* PackageName:com.gupaoedu.adapter
* Description:
*登录类
* @date:2020/7/20 21:26
* @author:robin
*/
public class Member {
private String username;
private String password;
private String mid;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
private String info;
}
package com.gupaoedu.decorator.old;
import com.gupaoedu.adapter.Member;
import com.gupaoedu.adapter.ResultMsg;
/**
* ClassName:SignServiceImpl
* PackageName:com.gupaoedu.decorator.old
* Description:
*
* @date:2020/7/23 14:15
* @author:robin
*/
public class SignServiceImpl implements IsigninService {
//注册方法
public ResultMsg regist(String username,String password){
return new ResultMsg("200","注册成功",new com.gupaoedu.adapter.Member());
}
//登录方法
public ResultMsg login(String username,String password){
return new ResultMsg("200","登录成功",new Member());
}
}
package com.gupaoedu.decorator.old;
import com.gupaoedu.adapter.Member;
import com.gupaoedu.adapter.ResultMsg;
/**
* ClassName:IsigninService
* PackageName:com.gupaoedu.decorator.old
* Description:
*
* @date:2020/7/23 14:14
* @author:13812536906
*/
public interface IsigninService {
//注册方法
public ResultMsg regist(String username, String password);
//登录方法
public ResultMsg login(String username, String password);
}
package com.gupaoedu.decorator.upgrade;
import com.gupaoedu.adapter.ResultMsg;
import com.gupaoedu.decorator.old.IsigninService;
/**
* ClassName:IsigninForThirdService
* PackageName:com.gupaoedu.decorator.upgrade
* Description:
*
* @date:2020/7/23 14:19
* @author:robin
*/
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);
}
package com.gupaoedu.decorator.upgrade;
import com.gupaoedu.adapter.ResultMsg;
import com.gupaoedu.decorator.old.IsigninService;
/**
* ClassName:IsigninForThirdServiceImpl
* PackageName:com.gupaoedu.decorator.upgrade
* Description:
* IsigninForThirdService 是新接口
* @date:2020/7/23 14:21
* @author:robin
*/
public class IsigninForThirdServiceImpl implements IsigninForThirdService {
private IsigninService isigninService;
public IsigninForThirdServiceImpl(IsigninService service){
this.isigninService=service;
}
@Override
public ResultMsg regist(String username, String password) {
return isigninService.regist(username,password);
}
@Override
public ResultMsg login(String username, String password) {
return isigninService.login(username,password);
}
public ResultMsg loginForQQ(String openid){
//适配器无缝对接
//1.认为openid全局唯一,我们可以把它当做用户名
//2.密码默认为 null; 或者为QQ_EMPTY
//3.注册:在原有系统里创建一个用户
ResultMsg msg = this.regist(openid, null);
//4.调用原来的登录方法。
msg = this.login(openid, null);
return msg;
}
public ResultMsg loginForWechat(String openid){
return null;
}
public ResultMsg loginForToken(String token){
return null;
}
public ResultMsg loginForTelphone(String telphone,String code){
return null;
}
public ResultMsg loginForRegist(String username,String password){
return null;
}
}
package com.gupaoedu.decorator;
import com.gupaoedu.adapter.SigninForThirdService;
import com.gupaoedu.decorator.old.SignServiceImpl;
import com.gupaoedu.decorator.upgrade.IsigninForThirdService;
import com.gupaoedu.decorator.upgrade.IsigninForThirdServiceImpl;
/**
* ClassName:SignInTest
* PackageName:com.gupaoedu.decorator
* Description:
*
* @date:2020/7/23 14:35
* @author:robin
*/
public class SignInTest {
public static void main(String[] args) {
/**
* 这样用好处: 保留了原来的方法和逻辑,而且两个需求使用的话并不影响的。
* 对它进行了升级与优化
*/
IsigninForThirdService isigninForThirdService=new IsigninForThirdServiceImpl(new SignServiceImpl());
/**
* 表现形式的区别:
* 适配器模式,换句话说,原来的功能可以不用了,可以丢弃了。
* 装饰器模式:原来的功能依旧对外开放,依旧保留;新的功能同样也可以用
* 装饰者模式变相多继承。(属于结构型模式,使用的是面向对象的思想设计)
*/
isigninForThirdService.loginForQQ("iiiiiiiiidd123");
}
}