适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
[]类图
对象适配器模式类图
类适配器模式类图
外观模式类图
[]适配器模式的实现
()对象适配器:采用组合方式来实现
目标接口
public interface Duck {
void quack();
void fly();
}
目标实现类
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I'm flying");
}
}
被适配者接口
public interface Turkey {
void gobble();
void fly();
}
被适配者实现类
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");
}
}
适配器类(将Turkey当成Duck来使用)
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
测试
public static void main(String args[]) {
Duck mallardDuck = new MallardDuck();
mallardDuck.quack();
mallardDuck.fly();
System.out.println("****************");
Turkey wildTurkey = new WildTurkey();
wildTurkey.gobble();
wildTurkey.fly();
System.out.println("****************");
Duck adapter = new TurkeyAdapter(wildTurkey);
adapter.quack();
adapter.fly();
}
()类适配器(java不支持多继承,无法实现):采用多继承方式来实现
类适配器继承目标类和被适配器者,重写目标类的方法并委托给被适配器者。
[]
()对象适配器采用组合方式来实现,类适配器采用多继承方式来实现。
()适配器类实现了目标接口,并持有被适配者的实例。
()使用对象组合,以修改的接口包装被适配者。被适配的任何子类,都可以搭配者适配器使用。
()对象适配器采用组合的方式,不仅可以适配某个类,也可以适配该类的任何子类。类适配器不需要重新实现整个被适配者,必要的时候,可以覆盖被适配者的行为。
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
[]类图
[]外观模式的实现
子系统类
public class Amplifier {
public void on() {
System.out.println("amplifier on");
}
public void off() {
System.out.println("amplifier off");
}
}
子系统类
public class Tuner {
public void on() {
System.out.println("tuner on");
}
public void off() {
System.out.println("tuner off");
}
}
子系统类
public class DvdPlayer {
public void player() {
System.out.println("dvdPlayer player");
}
public void off() {
System.out.println("dvdPlayer off");
}
}
统一接口类
public class HomeTheaterFacade {
private Amplifier amplifier;
private Tuner tuner;
private DvdPlayer dvdPlayer;
public HomeTheaterFacade(Amplifier amplifier, Tuner tuner, DvdPlayer dvdPlayer) {
this.amplifier = amplifier;
this.tuner = tuner;
this.dvdPlayer = dvdPlayer;
}
public void watchMovie() {
amplifier.on();
tuner.on();
dvdPlayer.player();
}
public void endMovie() {
amplifier.off();
tuner.off();
dvdPlayer.off();
}
}
测试
public static void main(String args[]) {
Amplifier amplifier = new Amplifier();
Tuner tuner = new Tuner();
DvdPlayer dvdPlayer = new DvdPlayer();
HomeTheaterFacade facade = new HomeTheaterFacade(amplifier, tuner, dvdPlayer);
facade.watchMovie();
facade.endMovie();
}
[]
()装饰者模式表示有一些新的行为或责任要加入到你的设计中,但是新的设计加入类中,而无需修改现有的代码。适配器模式主要用于接口转换。
()适配器模式是为了转换接口,外观模式是为了简化接口。