一、适配器模式
概念:
又叫变压器模式,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,是属于结构模式中的一种。
场景:
比方说在业务场景中,我们有一个需求是要对接第三方登录,例如qq,微信和手机登录,那么该如何适配呢,看下方代码
/**
* 登录接口
*/
public interface ILogin {
/**
* 是否支持该方法
*/
boolean support(Object clazz);
/**
* 登录方法
*/
void login(String username,Object a);
}
支持第三方接口
public interface IServerServiceForThird {
/**
* qq登录方法
* @param openId
*/
void LoginForQQ(String openId);
/**
* 微信登录方式
* @param openId
*/
void LoginForWeChat(String openId);
/**
* 电话登录方式
* @param phone
* @param code
*/
void LoginForTel(String phone,String code);
}
qq登录类
public class QQLogin extends ServerService implements ILogin{
public boolean support(Object clazz) {
return clazz instanceof QQLogin;
}
public void login(String username, Object password) {
System.out.println("qq登录");
super.register(username,null);
super.Login(username,null);
}
}
服务类
public class ServerService {
void Login(String username,String password){
System.out.println("验证账号密码---------"+username+"-----"+password);
System.out.println("开始登录---------");
}
void register(String username,String password){
System.out.println("验证是否注册---------"+username+"-----"+password);
System.out.println("开始注册---------");
}
}
服务类适配器
public class ServerServiceForThirdAdapter implements IServerServiceForThird{
public void LoginForQQ(String openId) {
process(QQLogin.class,openId);
}
public void LoginForWeChat(String openId) {
process(WeChantLogin.class,openId);
}
public void LoginForTel(String phone, String code) {
process(TelLogin.class,phone);
}
public void process(Class<? extends ILogin> clazz,String id){
try {
ILogin iLogin = clazz.newInstance();
boolean support = iLogin.support(iLogin);
if(support){
iLogin.login(id,null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
电话登录类
public class TelLogin extends ServerService implements ILogin{
public boolean support(Object clazz) {
return clazz instanceof TelLogin;
}
public void login(String id, Object adpter) {
System.out.println("手机登录");
super.register(id,null);
super.Login(id,null);
}
}
微信登录类
public class WeChantLogin extends ServerService implements ILogin{
public boolean support(Object clazz) {
return clazz instanceof WeChantLogin;
}
public void login(String username, Object password) {
System.out.println("微信登录");
super.register(username,null);
super.Login(username,null);
}
}
测试一下
二、桥接模式
概念:
多个维度,其中由一个抽象方法将接口变为自己的属性
场景:
给人发送消息,用什么方式发送紧急或者普通消息
消息接口
public interface IMessage {
void showMessage(String message,String user);
}
public class EmailMessage implements IMessage{
public void showMessage(String message, String user) {
System.out.println("email消息"+message+"发送给"+user);
}
}
qq发送消息
public class QQMessage implements IMessage{
public void showMessage(String message, String user) {
System.out.println("qq消息"+message+"发送给"+user);
}
}
发送的是普通消息
public class SimpleMessage extends AbstarctMessage{
public SimpleMessage(IMessage iMessage) {
super(iMessage);
}
public void showMessage(String message, String user) {
System.out.println("普通消息");
iMessage.showMessage(message,user);
}
}
发送紧急消息
public class UrlyMessage extends AbstarctMessage{
public UrlyMessage(IMessage iMessage) {
super(iMessage);
}
public void showMessage(String message, String user) {
System.out.println("加急消息");
iMessage.showMessage(message,user);
}
}
桥梁抽象类
public abstract class AbstarctMessage {
public IMessage iMessage;
public AbstarctMessage(IMessage iMessage) {
this.iMessage = iMessage;
}
}
测试一下
DriverManager就是桥接模式
比方说:
Class.forName(“com.mysql.jdbc.Driver”);
String url = “jdbc:mysql://localhost:3306/testuser=root&password=123456″;
Connection con = DriverManager.getConnection(url);
Statement statement = con.createStatement();
可以看到第一行代码,为什么要这么写
可以看到这个地方new了一个Driver,那么我们第一行代码就是为了创建这个类