Java设计模式之适配器模式(Adapter)

上课的时候不能撸其它代码,只能看下java设计模式的书,网上也有很多总结好的,但觉得自己总结一遍能收获的更多,下来慢慢总结下这些设计模式。之所以叫接口型模式,是因为这些设计模式都需要用到Interface。
适配器模式的意图
使用不同接口的类所提供的服务为客户端提供它所期望的接口
Adapter之类的适配器
比如一个客户找到黑猫要一件衣服,要求这件衣服必须要有拉链,扣子,高领(interface),但是黑猫我呢只有模板是拉链和扣子的(现有具体类),没有高领的,但是如果重新定义满足客户的要求的工作是很麻烦的,而且浪费空间,不能重用,那么现在就要用到类的适配器了,就是我们再弄一个子类来适配现有类(模板)去满足这个interface,关系图太麻烦,小长我还在学习中啊,直接写个代码总结吧
客户要求的功能(interface)

public interface Client {
    public void laLian();
    public void kouZi();
    public void gaoLin();
}

黑猫小长现在有的模板(现有类)

//看嘛,现在是不是没有高领,客户不干啊
public class NowHave {
    public void laLian(){
        System.out.println("我有拉链");
    }
    public void kouZi(){
        System.out.println("我有扣子");
    }
}

弄个小弟来适配现有模板去满足客户

//你要满足,肯定要实现这个接口涩,利用现有的模板当然要继承他了,最后
public class Adapter extends NowHave implements Client{

    @Override
    public void gaoLin() {
        // TODO Auto-generated method stub
        System.out.println("我有高领了");
    }

}

测试一下

//多态的知识,就满足了
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Client cl = new Adapter();
        cl.gaoLin();
        cl.kouZi();
        cl.laLian();
    }

}

Adapter之对象适配器
就是咱们可以间接利用适配器类去用咱有现有类的实例,比如咱们现有模板有一个方法是吧,但是客户要求的方法呢和这个名字不一样,但是要用到模板里的这个方法,咱就用适配器类来返回现有类的实例,通过这个实例调用这个需要用到的方法。直接上个例子:
要求类

//客户要求的内容
public abstract class RequredClass {
    public abstract String requiredMethod();
}

黑猫现在有的,并且是客户要求的可以用到的

//俺现在有的类,里面有个方法呢是要求类要用到的
public class ExistClass {
    public String  userfulMethod(){
        /*
         *内容 
         */
        return null;
    }
}

适配呗

//咱们来适配
public class Adapter extends RequredClass{
    //既然是对象适配器,要用到已有类的对象涩,定义一个先
    private ExistClass existClass;
    public Adapter(ExistClass existClass){
        this.existClass = existClass;
    }

    @Override
    public String requiredMethod() {
        // TODO Auto-generated method stub
        return existClass.userfulMethod();
    }
}

对象适配器更加脆弱
为啥子呢?对象适配器,俺们的适配器类没有继承接口,没有接口的约束,可能在运行时出现编译时无法检测到的问题,而且俺们不能想访问现有类的属性或方法,不能保证咱们现有类的属性或方法的声明方式,很难约束控制它们要做的事情。
Adapter之缺省适配器
就是客户本来要求很多功能,但是现在只需要一个功能了,不多说,直接上代码
要求的接口

//目标接口
public interface Target {
    public void method1();
    public void method2();
    public void method3();
}

再定义一个类继承上面的(只是一个中间过渡类)

public class GuoDu implements Target{

    //所有方法不必去实现
    @Override
    public void method1() {
        // TODO Auto-generated method stub

    }

    @Override
    public void method2() {
        // TODO Auto-generated method stub

    }

    @Override
    public void method3() {
        // TODO Auto-generated method stub

    }

}

客户只要method3的功能,咱们就只有method3涩

public class FunctionClass extends GuoDu {
    public void method3(){
        /*
         * 具体功能
         * */
    }
}

再来一个测试类

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Target target = new FunctionClass();
        target.method2();
    }

}
//你去调用method1和method2是没有效果的,因为俺们的功能类没有实现这个,这就是需要哪个,咱就重写哪个方法

Adapter应用场景
如果一个抽象类或者接口的话,就必须要重写所有的抽象方法。
那么,如果一个接口中定义的抽象方法过多,而子类中很多抽象方法又不需要用到,就应该设计一个适配器。在JAVA的GUI编程中,jdk就自动封装了多个适配器。比如: windowAdapter。

发布了36 篇原创文章 · 获赞 30 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章