外观模式:又叫“门面模式”属于结构型设计模式,是比较简单,常见的,使用比较广泛的设计模式之一。主要的目的是通过提供对现有系统中方法的委托调用来简化客户端的请求
定义
外部想要跟内部通信,必须通过一个由内部提供的高层次接口的对象进行。换成大白话就是说,外面的要跟内部的交流,只能通过内部提供的唯一一个通信窗口。其目的就是隐藏系统的复杂性,简化客户端和系统交互的接口。
例子
又到了举栗子的时间了。现代社会,大家都过着快节奏的生活,生活质量也逐步提高了,很多时候需要一些特别的东西来满足一下自己。这时就出现了一种业务私人订制
例如现在你要新装配一台电脑主机,这天你去逛逛电脑城
上码:
普通写法
如果是自己去组装(没有用模式的方式)
/**
* 组装一台电脑主机的步骤
*/
public interface IBuildUp {
public void getCpu();
public void getMotherBoard();
public void getMemory();
public void getPower();
public void getStorage();
public void getFans();
public void getChassis();
public void build();
}
public class BuildUpImpl implements IBuildUp{
@Override
public void getCpu() {
System.out.println("拿了一块CPU");
}
@Override
public void getMotherBoard() {
System.out.println("拿了一块主板");
}
@Override
public void getMemory() {
System.out.println("拿了两条8G内存");
}
@Override
public void getPower() {
System.out.println("拿了一个电源");
}
@Override
public void getStorage() {
System.out.println("拿了一块固态硬盘");
}
@Override
public void getFans() {
System.out.println("拿了些散热器");
}
@Override
public void getChassis() {
System.out.println("拿了一个机箱");
}
@Override
public void build() {
System.out.println("把硬件组装起来并装上系统 => 电脑主机");
}
}
public class Client {
public static void main(String[] args) {
IBuildUp computer = new BuildUpImpl();
computer.getCpu();
computer.getMemory();
computer.getMotherBoard();
computer.getPower();
computer.getStorage();
computer.getFans();
computer.getChassis();
computer.build();
}
}
运行结果:
外观模式版本
但是,这样干一天,才搞出你要的主机,不累吗?过程中还可能各种翻车。不过幸好电脑城不是有各种门店吗?不是有人可以帮你装机的吗?你就把事交给他们不就完了吗?你只需要跟他说,你要装一台电脑主机,他不就会给你搞好了吗?是吧!继续上码:
这时需要一家电脑店
/**
* 电脑门店
*/
public class Store {
IBuildUp computer = new BuildUpImpl();
public Store() {
System.out.println("电脑门店");
}
/**
* 装机服务
*/
public void getComputer(){
computer.getCpu();
computer.getMemory();
computer.getMotherBoard();
computer.getPower();
computer.getStorage();
computer.getFans();
computer.getChassis();
computer.build();
}
}
而你,只需要在这个门店使用他们的装机服务就可以得到一台你要的电脑主机了
public class Client {
public static void main(String[] args) {
Store store = new Store();
store.getComputer();
}
}
运行结果:
其中 Store
就是关键,他就是外部和内部交流的接口。它把内部复杂的操作,对各个子系统的数据获取都处理了,只留给外部一个访问接口,简化了访问方式。外部只需要跟它交流,就能间接完成很多复杂的操作。
另外,如果是商家心情大好,送了你一些LED灯带,只需要在Store
里修改即可,调用的地方并不需要改变
public class LED {
public void setLED(IBuildUp build){
System.out.println("给主机加装LED灯带");
}
}
/**
* 电脑门店
*/
public class Store {
IBuildUp computer = new BuildUpImpl();
LED led = new LED();
public Store() {
System.out.println("电脑门店");
}
/**
* 装机服务
*/
public void getComputer(){
computer.getCpu();
computer.getMemory();
computer.getMotherBoard();
computer.getPower();
computer.getStorage();
computer.getFans();
computer.getChassis();
led.setLED(computer);
computer.build();
}
}
运行结果:
优缺点
- 优点 : 解耦,减少了系统的互相依赖,提高了灵活性和安全性
- 缺点:不符合开闭原则,遇到有需要修改的时候只能去修改门面角色的代码。