首页 > 代码库 > 设计模式之适配器模式与外观模式

设计模式之适配器模式与外观模式

适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

例子:火鸡变鸭子。

先定义一个鸭子接口。

package cn.sp.test06;
/**
 * 鸭子
 * @author 2YSP
 *
 */
public interface Duck {
    //具备呱呱叫 和 飞行的能力
    public void quack();
    public void fly();
}
package cn.sp.test06;
/**
 * 绿头鸭是鸭子的子类
 * @author 2YSP
 *
 */
public class MallardDuck implements Duck{

    @Override
    public void quack() {
        System.out.println("Quack quack ");
        
    }

    @Override
    public void fly() {
        System.out.println("I am flying .. .");
        
    }

}

火鸡接口:

package cn.sp.test06;
/**
 * 火鸡
 * @author 2YSP
 *
 */
public interface Turkey {
    //火鸡只会咯咯叫 
    public void gobble();
    public void fly();//虽然会飞,但飞不远
}

package cn.sp.test06;
/**
 * 野生火鸡
 * @author 2YSP
 *
 */
public class WildTurkey implements Turkey{

    @Override
    public void gobble() {
        System.out.println("Gobble gobble");
    }

    @Override
    public void fly() {
        System.out.println("I‘m flying a short distance");
        
    }

}

重点来了,适配器。

 

package cn.sp.test06;
/**
 * 适配器,火鸡冒充鸭子
 * @author 2YSP
 *
 */
public class TurkeyAdapter implements Duck {
    Turkey turkey;
    
    public TurkeyAdapter(Turkey turkey){
        this.turkey = turkey;
    }
    @Override
    public void quack() {//其实调用的是火鸡的行为
        turkey.gobble();
    }

    @Override
    public void fly() {
        for(int i = 0 ; i<5 ; i++){
            turkey.fly();
        }
    }

    

}

 

测试:

package cn.sp.test06;
/**
 * 适配器模式
 * @author 2YSP
 *
 */
public class DuckTestDrive {
    public static void main(String[] args) {
        MallardDuck duck = new MallardDuck();
        
        WildTurkey turkey = new WildTurkey();
        
        Duck turkeyAdapter = new TurkeyAdapter(turkey);
        System.out.println("The Turkey says ...");
        turkey.gobble();
        turkey.fly();
        
        System.out.println("\nThe Duck says ...");
        duck.quack();
        duck.fly();
        
        System.out.println("\nThe turkeyAdapter says ...");
        turkeyAdapter.quack();
        turkeyAdapter.fly();
    }
    
}

二、外观模式

外观模式就是当我们要调用许多类的方法时,直接调用的话十分复杂且不易维护,但是可以新建一个类,其中含有所需要的所有对象,然后将他们的方法封装在一个方法内,这样只要调用新建的类方法即可。

定义:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

其中遵循了一条设计原则:最少知识原则:只和你的密友谈话。

 

public float getTemp(){//反例
    Thermometer thermometer = station.getThermometer();
    return thermometer.getTemperature();
}

public float getTemp(){//正确
    return station.getTemperature();
}
}

 

外观,装饰者,适配器三种模式很容易混淆,可以这样区分。

装饰者:不改变接口,但加入责任(新功能)。

适配器:将一个接口转成另一个接口。

外观:让接口更简单。

 

设计模式之适配器模式与外观模式