【Java设计模式】适配器模式
一、设计原则
- 开闭原则(Open Close Principle)
- 里氏代换原则(Liskov Substitution Principle)
- 依赖倒转原则(Dependence Inversion Principle)
- 接口隔离原则(Interface Segregation Principle)
- 单一职责原则(Single Responsibility Principle)
- 最少知道原则(Demeter Principle)
- 合成复用原则(Composite Reuse Principle)
参考:
1、设计原则概念
2、23设计原则示例+讲解
二、适配器模式
场景:
假设现在你处于中国使用国标充电器进行充电、这时你需要使用一个国标充电的接口(协议、契约)+实现接口(满足协议)的国标充电类,然后再设一个此场景的类进行使用此充电器进行充电;
此后,你有了一个iphone需要英标的充电器进行充电,国标无法满足,此时就需要一个适配器来进行转换(相当于桥梁的作用),那么怎么做呢??
第一步:获取英标的协议
第二步:来一个英标的充电器(实现协议)
第三步:进行适配 (实现国标协议的适配类,那么和国标的充电器类有什么区别呢,那就是需要将国标充电的方法重写为英标的充电方法)
示例代码:
package com.company.adapterpattern;
// 国标的充电协议(接口)
interface CnPluginInterface{
void chargeWith2Pins();
}
// 国标充电(原有的)
class CnPlugin implements CnPluginInterface{
@Override
public void chargeWith2Pins() {
System.out.println("charge with CnPlugin..");
}
}
// 在中国家里进行充电
class Home{
//
private CnPluginInterface cnPlugin;
public Home(){ }
public Home(CnPluginInterface cnPlugin){
this.cnPlugin= cnPlugin;
}
public void setPlugin(CnPluginInterface cnPlugin){
this.cnPlugin = cnPlugin;
}
public void charge(){
//用国标进行充电
cnPlugin.chargeWith2Pins();;
}
}
// 适配器
interface EnPluginInterface{
void chargeWith3pins();
}
class EnPlugin implements EnPluginInterface{
@Override
public void chargeWith3pins() {
System.out.println("charge with EnPlugin");
}
}
//进行对cn接口的适配
class cnPluginAdapter implements CnPluginInterface{
private EnPluginInterface enPlugin;
public cnPluginAdapter(EnPluginInterface enPlugin){
this.enPlugin= enPlugin;
}
@Override
public void chargeWith2Pins() {
enPlugin.chargeWith3pins();
}
}
public class CnTest {
public static void main(String[]args){
// 进行国标充电
CnPluginInterface cnPlugin = new CnPlugin();
Home home = new Home();
home.setPlugin(cnPlugin);
home.charge();
// 进行适配之后
EnPluginInterface enPlugin = new EnPlugin();
cnPluginAdapter pluginAdapter = new cnPluginAdapter(enPlugin);
home.setPlugin(pluginAdapter);
home.charge();
}
}
/* 场景: 在家中充电需要使用二插座进行充电; 但现在需要使用英标进行充电就需要一个适配器进行转换充电(英标就是一个过渡的适配) 二插座充电:二插座协议、二插座充电、home类 三插座:三插座协议和充电类、适配器进行二插座到三插座过渡适配(也就是对应的方法重写) */
还没有评论,来说两句吧...