Adaptor&Decorator&Facade模式分析

本文深入探讨Adaptor、Decorator和Facade三种设计模式,揭示它们的差异和应用场景。适配器模式用于连接不兼容接口,装饰者模式在不修改原有类的情况下动态扩展功能,门面模式则简化了复杂系统的接口,降低外部依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文目的在于对比分析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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值