1.根据意图对模式分类
2.接口型模式介绍
2.1. 抽象类与接口的区别
①一个类能实现多个接口,但只能继承一个抽象类
②抽象类可以包含具体方法,但是接口只能都是抽象方法
③抽象类可以声明和使用字段,接口不能,但可以创建静态的final常量
④抽象类可以定义构造函数,但是接口不能
⑤抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
......
3. 适配器模式
适配以模式的意图在于:使用不同的接口的类所提供的服务为客户端提供它期望的服务。适配器模式将一个类的接口转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的类可以在一起工作。
3.1例子
/**
客户端,一个电脑需要用三芯插座充电
*/
public class Computer {
//三芯插座
private ThreePlugIf plug;
public Computer(ThreePlugIf plug){
this.plug = plug;
}
//充电,需要用到的是三芯插座。
public void charge(){
plug.powerWithThree();
}
public static void main(String[] args) {
//只有两芯插座
GBTwoPlug two = new GBTwoPlug();
ThreePlugIf three = new TwoPlugAdapter(two);
Computer c = new Computer(three);
c.charge();
three = new TwoPlugAdapterExtends();
c = new Computer(three);
c.charge();
}
}
/*
* 三芯插座:目标接口
*/
public interface ThreePlugIf {
public void powerWithThree();
}
public class GBTwoPlug {
//两芯插座:被适配器类
public void powerWithTwo(){
System.out.println("用两芯插座供电");
}
}
采用组合方式的适配器成为对象适配器。
特点:把被适配者作为一个对象组合到适配器类中,以修改目标接口包装被适配者。
/*
* 适配器,两芯插座;
*/
public class TwoPlugAdapter implements ThreePlugIf {
private GBTwoPlug plug;
public TwoPlugAdapter(GBTwoPlug plug){
this.plug = plug;
}
@Override
public void powerWithThree() {
System.out.println("转换成三芯插座");
plug.powerWithTwo();
}
}
采用继承方式的适配器成为类适配器。
特点:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类实现适配
/*
* 继承
*/
public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf {
@Override
public void powerWithThree() {
System.out.print("继承转化");
this.powerWithTwo();
}
}