网站整合discuz,做网站网站是什么案件,失物招领网站开发项目需求分析,seo站内优化和站外优化外观模式 (Facade Pattern)
外观模式是一种 结构型设计模式#xff0c;通过为子系统中的一组接口提供一个统一的高层接口#xff0c;简化了子系统的使用#xff0c;让复杂系统更易于访问。 原理
核心思想#xff1a; 提供一个 统一的接口 来访问子系统中的多个接口#…外观模式 (Facade Pattern)
外观模式是一种 结构型设计模式通过为子系统中的一组接口提供一个统一的高层接口简化了子系统的使用让复杂系统更易于访问。 原理
核心思想 提供一个 统一的接口 来访问子系统中的多个接口从而简化客户端与复杂子系统的交互。客户端只需与外观接口交互避免直接接触子系统的复杂实现细节。 适用场景 需要简化复杂系统的访问。希望子系统能够被独立使用同时也需要一个简化的入口。 参与角色 Facade外观类为客户端提供简化的高层接口。Subsystems子系统实现系统的实际功能可以被外观类调用但对子系统的调用是透明的。Client客户端通过外观类访问子系统。 优点
简化接口降低客户端与子系统之间的耦合性。松散耦合客户端无需直接依赖子系统从而更容易维护和扩展。更好的层次划分为复杂系统提供一个清晰的结构。 缺点
可能导致额外的封装如果外观类的设计不够好可能导致新的复杂性。单一职责问题外观类可能成为上帝类承担过多的职责。 示例代码
场景描述
假设有一个 家庭影院系统包含多个子系统投影仪、音响、DVD播放器。我们希望通过一个简化的接口来启动和关闭家庭影院而不需要逐个操作每个子系统。 1. 定义子系统类
// 投影仪子系统
public class Projector {public void on() {System.out.println(Projector is ON);}public void off() {System.out.println(Projector is OFF);}
}// 音响子系统
public class SoundSystem {public void on() {System.out.println(Sound System is ON);}public void off() {System.out.println(Sound System is OFF);}
}// DVD播放器子系统
public class DVDPlayer {public void play() {System.out.println(DVD Player is PLAYING);}public void stop() {System.out.println(DVD Player has STOPPED);}
}2. 创建外观类
// 外观类家庭影院控制器
public class HomeTheaterFacade {private Projector projector;private SoundSystem soundSystem;private DVDPlayer dvdPlayer;public HomeTheaterFacade(Projector projector, SoundSystem soundSystem, DVDPlayer dvdPlayer) {this.projector projector;this.soundSystem soundSystem;this.dvdPlayer dvdPlayer;}// 启动家庭影院public void startMovie() {System.out.println(Starting Home Theater...);projector.on();soundSystem.on();dvdPlayer.play();}// 关闭家庭影院public void stopMovie() {System.out.println(Stopping Home Theater...);dvdPlayer.stop();soundSystem.off();projector.off();}
}3. 客户端代码
public class FacadePatternExample {public static void main(String[] args) {// 创建子系统对象Projector projector new Projector();SoundSystem soundSystem new SoundSystem();DVDPlayer dvdPlayer new DVDPlayer();// 创建外观对象HomeTheaterFacade homeTheater new HomeTheaterFacade(projector, soundSystem, dvdPlayer);// 使用外观类操作子系统homeTheater.startMovie(); // 启动家庭影院homeTheater.stopMovie(); // 关闭家庭影院}
}输出结果
Starting Home Theater...
Projector is ON
Sound System is ON
DVD Player is PLAYING
Stopping Home Theater...
DVD Player has STOPPED
Sound System is OFF
Projector is OFFUML 类图 ---------------------| HomeTheaterFacade |---------------------| startMovie() || stopMovie() |---------------------/ | \/ | \------------- ------------- -------------| Projector | | SoundSystem | | DVDPlayer |------------- ------------- -------------| on() | | on() | | play() || off() | | off() | | stop() |------------- ------------- -------------使用场景
复杂系统的统一入口如数据库访问、网络通信等。模块间的解耦简化子系统对外暴露的接口降低耦合性。提供默认行为如框架中预定义的工具类。 小结
外观模式通过引入外观类降低了客户端对复杂子系统的依赖增强了系统的模块化。它适合用于封装复杂系统同时保持子系统的灵活性。需要注意外观类的职责划分避免其成为“上帝类”。