适配器与外观模式

来源:互联网 发布:华为手机usb共享网络 编辑:程序博客网 时间:2024/05/16 19:18

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

[]类图

对象适配器模式类图

这里写图片描述

类适配器模式类图

这里写图片描述

外观模式类图

这里写图片描述

[]适配器模式的实现

()对象适配器:采用组合方式来实现

目标接口

public interface Duck {void quack();void fly();}

目标实现类

public class MallardDuck implements Duck {@Overridepublic void quack() {    System.out.println("Quack");}@Overridepublic void fly() {    System.out.println("I'm flying");}}

被适配者接口

public interface Turkey {void gobble();void fly();}

被适配者实现类

public class WildTurkey implements Turkey {@Overridepublic void gobble() {    System.out.println("Gobble gobble");}@Overridepublic 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;}@Overridepublic void quack() {    turkey.gobble();}@Overridepublic 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();}

[]
()装饰者模式表示有一些新的行为或责任要加入到你的设计中,但是新的设计加入类中,而无需修改现有的代码。适配器模式主要用于接口转换。
()适配器模式是为了转换接口,外观模式是为了简化接口。