本文目的在于对比分析Adaptor,Decorator,Facade这三种设计模式的差异,加深对这几种设计模式的理解。
模式 | 说明 |
Adaptor | 把接口A的具体实现转换成对接口B的实现,以实现对B接口调用的客户能使用A提供的功能。 |
Decorator | 封装原来的接口A实现类,动态增加额外的功能,实现对原有实现类功能的扩展。 |
Facade | 为复杂的子系统提供抽象简单的接口,使用方调用接口,而不用关注子系统内部的复杂逻辑。 |
Adaptor 适配器模式
适配器模式使两个不相关的接口一起工作。在真实的工作场景中,会出现一个客户端依赖B接口的实现类,但需要使用A接口的功能满足客户端的需要。适配器模式就能够实现使A,B两个不相关的接口一起工作,把对A接口功能的实现类转化成对B接口功能的实现。
demo的类图如下:
public interface Duck {
public void quack();
}
public interface Goose {
public void cackle();
}
public class WightGoose implements Goose {
@Override
public void cackle() {
System.out.println("cackle");
}
}
public class GooseToDuckAdapter implements Duck {
private Goose goose;
public GooseToDuckAdapter(Goose goose) {
this.goose = goose;
}
@Override
public void quack() {
goose.cackle();
}
}
public class Client {
public static void main(String[] args){
Goose goose = new WightGoose();
Duck duck = new GooseToDuckAdapter(goose);
duck.quack();
}
}
Decorator 装饰者模式
装饰者模式也可以叫静态代理,对接口的实现类,可以在不更改原有实现类逻辑的基础上静态地扩展原有实现类功能,实现对额外逻辑增加代码,而不是更改代码。
demo类图:
public class GreenDuck implements Duck{
@Override
public void quack() {
System.out.println("green Duck quack!");
}
}
public class SmartDuck implements Duck {
private Duck duck;
public SmartDuck(Duck duck) {
this.duck = duck;
}
@Override
public void quack() {
System.out.println("become Smarter");
duck.quack();
System.out.println("louder and sweet!");
}
}
public class Client {
public static void main(String[] args){
Duck duck = new GreenDuck();
duck.quack();
System.out.println();
Duck smartDuck = new SmartDuck(duck);
smartDuck.quack();
}
}
Facade 门面模式
门面模式隐藏复杂系统的内部结构和实现细节,为复杂的系统提供对外使用的简单方便的调用接口,使复杂系统的功能更简单使用,理解以及测试,同时减少外部系统对该复杂系统的依赖。
不用Facade实现demo:
public class AirConditioner {
public void turnOn(){
System.out.println("AirConditioner on!");
}
public void turnOff(){
System.out.println("AirConditioner off!");
}
}
public class Audio {
public void musicOn(){
System.out.println("Music on!");
}
public void musicOff(){
System.out.println("Music off!");
}
}
public class Curtain {
public void openCurtain(){
System.out.println("open Curtain!");
}
public void closeCurtain(){
System.out.println("close Curtain!");
}
}
public class Light {
public void ligntOn(){
System.out.println("turn Light on!");
}
public void ligntOff(){
System.out.println("turn Light off!");
}
}
public class ClientWithNoFacade {
public static void main(String[] args){
System.out.println("When I coming home,I do ");
AirConditioner airConditioner = new AirConditioner();
Audio audio = new Audio();
Curtain curtain = new Curtain();
Light light = new Light();
airConditioner.turnOn();
audio.musicOn();
curtain.openCurtain();
light.ligntOn();
System.out.println("When I am out,I need to do ");
airConditioner.turnOff();
audio.musicOff();
curtain.closeCurtain();
light.ligntOff();
}
}
使用Facade demo:
public class HomeFacade {
private AirConditioner airConditioner;
private Audio audio;
private Curtain curtain;
private Light light;
public HomeFacade() {
airConditioner = new AirConditioner();
audio = new Audio();
curtain = new Curtain();
light = new Light();
}
public void turnOn(){
System.out.println("HomeFacade do");
airConditioner.turnOn();
audio.musicOn();
curtain.openCurtain();
light.ligntOn();
}
public void turnOff(){
System.out.println("HomeFacade do");
airConditioner.turnOff();
audio.musicOff();
curtain.closeCurtain();
light.ligntOff();
}
}
public class ClientWithFacade {
public static void main(String[] args){
HomeFacade homeFacade = new HomeFacade();
System.out.println("when I coming home");
homeFacade.turnOn();
System.out.println();
System.out.println("When I leaving");
homeFacade.turnOff();
}
}