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

时间:2021-10-02 22:00:42

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

例子:火鸡变鸭子。

先定义一个鸭子接口。

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();
}
}

 

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

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

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

外观:让接口更简单。