Java设计模式【外观模式】-结构型

介绍

外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂系统提供一个简化的接口,以便客户端可以更容易地使用系统。它隐藏了系统的复杂性,并向客户端提供一个简单的接口,使客户端与系统的交互更加简单和直观。

结构

外观模式包含以下主要角色:

  1. Facade(外观): 外观类是外部客户端访问子系统的入口点。它知道子系统的功能和责任,并将客户端的请求委派给适当的子系统对象进行处理。

  2. Subsystem Classes(子系统类): 子系统类实现了系统的各种功能。它们处理外观类指派的任务,但不直接与客户端进行通信。

  3. Client(客户端): 客户端通过外观类间接地与子系统交互,通过简化的接口使用系统功能而不必了解系统的复杂性和细节。


应用场景

  • 简化复杂系统接口:当系统拥有复杂的结构和多个子系统时,外观模式可以提供一个简化的接口,隐藏复杂性,使客户端易于使用。

  • 分层系统:外观模式可以作为不同层之间的入口点,为每个层提供一个统一的接口,降低层与层之间的耦合度。

  • 封装复杂库:当使用一个复杂的第三方库或 API 时,可以通过外观模式来封装其复杂性,提供更简单和直观的接口给应用程序。

  • 服务类封装:将多个服务类整合到一个外观类中,提供统一的访问接口,从而简化客户端和服务之间的交互过程。


Java实现示例

假设有一个复杂的家庭影院系统,包含多个设备和操作。我们可以使用外观模式来创建一个家庭影院外观,简化客户端控制家庭影院的复杂性。

 

// 子系统类 - 投影仪
public class Projector {
    public void on() {
        System.out.println("Projector is on");
    }

    public void off() {
        System.out.println("Projector is off");
    }

    public void setInput(String input) {
        System.out.println("Setting projector input to: " + input);
    }
}

// 子系统类 - 音响
public class Amplifier {
    public void on() {
        System.out.println("Amplifier is on");
    }

    public void off() {
        System.out.println("Amplifier is off");
    }

    public void setVolume(int volume) {
        System.out.println("Setting amplifier volume to: " + volume);
    }
}

// 子系统类 - DVD 播放器
public class DvdPlayer {
    public void on() {
        System.out.println("DVD Player is on");
    }

    public void off() {
        System.out.println("DVD Player is off");
    }

    public void play(String movie) {
        System.out.println("Playing DVD: " + movie);
    }
}


// 外观类 - 家庭影院
public class HomeTheaterFacade {
    private Projector projector;
    private Amplifier amplifier;
    private DvdPlayer dvdPlayer;

    public HomeTheaterFacade(Projector projector, Amplifier amplifier, DvdPlayer dvdPlayer) {
        this.projector = projector;
        this.amplifier = amplifier;
        this.dvdPlayer = dvdPlayer;
    }

    // 启动家庭影院
    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        projector.on();
        amplifier.on();
        amplifier.setVolume(5);
        dvdPlayer.on();
        dvdPlayer.play(movie);
    }

    // 停止家庭影院
    public void endMovie() {
        System.out.println("Shutting down the movie theater...");
        projector.off();
        amplifier.off();
        dvdPlayer.off();
    }
}

public class Client {
    public static void main(String[] args) {
        // 创建子系统对象
        Projector projector = new Projector();
        Amplifier amplifier = new Amplifier();
        DvdPlayer dvdPlayer = new DvdPlayer();

        // 创建外观对象
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(projector, amplifier, dvdPlayer);

        // 启动家庭影院观看电影
        homeTheater.watchMovie("The Avengers");

        // 关闭家庭影院
        homeTheater.endMovie();
    }
}

Spring中使用场景

Spring 框架本身不会显式地使用外观模式,但是通过合理的设计和结构,可以在应用中实现类似外观模式的效果,从而简化系统的复杂性,提高代码的可读性和可维护性。

总结

  • 外观模式在设计中常用于隐藏系统的复杂性,提供一个更简单和统一的接口,使得客户端可以方便地使用系统而不必关注其内部实现细节。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值