一、适配器与外观模式
适配器模式:将一个类的接口,转换成客户期待的另一个接口,适配器让原本接口不兼容的类可以合作无间。
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
外观模式白话:开启电视,你要插电源,再按下遥控的“开”键,同时为了你要由音量,也要把音量键“开”按一下,然而外观模式就是定义了一个A接口来封装这些操作的BCD接口,只要按下A接口,就可以启动BCD接口,而不用说一个B,一个C,一个D的接口按。
二、设计原则
最少知识原则:只和你的密友谈话。
这就是说,当你正在设计一个系统,不管任何对象,你都要注意它所交互的类有哪些,并注意他和这些类是如何交互的。这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统的一部分,会影响到其他部分,降低维护成本。
三、适配器代码实现
这里有鸭子类,火鸡类,我们实现了一个火鸡适配器,当火鸡可以扮演鸭子类的操作
1、鸭子类
package com.oyhp.duck;
//鸭子接口
public interface Duck {
public void quack();
public void fly();
}
package com.oyhp.duck;
//绿头鸭
public class MallardDuck implements Duck{
@Override
public void quack() {
//叫
System.out.println("Quack");
}
@Override
public void fly() {
//飞
System.out.println("I'm flying");
}
}
2、火鸡类
package com.oyhp.turkey;
//街头玩禽-火鸡
public interface Turkey {
public void gobble();
public void fly();
}
package com.oyhp.turkey;
public class WildTurkey implements Turkey{
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println("Gobble gobble");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying a short distance");
}
}
3、获取适配器
package com.oyhp.adapter;
import com.oyhp.duck.Duck;
import com.oyhp.turkey.Turkey;
//火鸡适配器
public class TurkeyAdaper implements Duck{
Turkey turkey; //组合火鸡接口
//通过构造器获取火鸡类
public TurkeyAdaper(Turkey turkey) {
// TODO Auto-generated constructor stub
this.turkey = turkey;
}
@Override
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
4、测试
package com.oyhp.test;
import com.oyhp.adapter.TurkeyAdaper;
import com.oyhp.duck.Duck;
import com.oyhp.duck.MallardDuck;
import com.oyhp.turkey.WildTurkey;
/**
*
* @author OYHP
* 客户使用适配器的过程如下:
* 1、客户通过目标接口调用适配器的方法对适配器发出请求
* 2、适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口
* 3、客户收到调用的结果,但并未察觉这一切是适配器在起转换作用
*/
public class DoRun {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck(); //鸭子
WildTurkey turkey = new WildTurkey(); //火鸡
Duck turkeyAdapter = new TurkeyAdaper(turkey); //火鸡适配器转成鸭子
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe Duck say...");
duck.quack();
duck.fly();
/*
* 虽然调用的是火鸡类,但是外观看起来却像鸭子,这个就是适配器,
* 懂一点电子设备就知道适配器类似于转接口的功能,把安卓接口转为typeC接口
*/
System.out.println("\nThe TurkeyAdapter say...");
turkeyAdapter.quack();
turkeyAdapter.fly();
}
}
四、适配模式类图
五、总结
1、本章没有实现外观模式的代码,自己可以看懂白话就好,因为我在写代码的过程中,无形的就已经在使用外观模式了。
2、外观不只是简化了接口,也将客户从组件的子系统中解耦。
3、外观模式和适配器可以包装许多类,但是外观的意图是简化接口而适配器的意图是将接口转换成不同接口