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
-----------------------------------+----------------------------------
注重的是覆盖、扩展 | 注重兼容、转换
-----------------------------------+----------------------------------
适配器实现方式:继承该类并扩展即可
装饰器模式:实现接口,并在定义的装饰器中声明接口并定义参数为接口的构造方法