「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。
一、什么是外观模式
外观模式:外观模式通过引入一个外观角色来简化客户端与子系统之间的调用,为复杂的子系统提供一个统一的接口,降低系统之间的耦合性。外观模式是一种结构型设计模式,也可以称为门面模式。举个栗子:我要用洗衣机洗衣服,需要先把衣服拿到洗衣机旁边,打开洗衣机盖子,把衣服放进去,关上盖子,启动洗衣机。上面一系列的工作需要我一个一个的去做,如果有个人帮我洗,那么我只需要告诉他让他去洗衣服就行了。这个人在外观模式中就表示的是门面角色,客户端可以直接调用,而不用去调用复杂的子系统。此外,外观模式也可以表现为我有几个子系统,我提供一个门面角色,对各个子系统的调用都通过这个门面角色。比如,一个子系统可以吃饭,一个子系统可以睡觉,还有一个子系统可以走路,提供一个门面角色我,代为调用各个子系统的功能。我直接吃饭,睡觉,走路。
二、外观模式的实现
public class User {
public void takeClothes(){
System.out.println("把衣服拿到洗衣机旁边");
}
public void putDownClother(){
System.out.println("把衣服放到洗衣机里面");
}
}
子系统,用户,可以进行拿衣服的操作。
public class Machine {
public void open(){
System.out.println("打开洗衣机盖子");
}
public void close(){
System.out.println("关闭洗衣机盖子");
}
public void start(){
System.out.println("洗衣机启动");
}
}
子系统,机器,可以打开盖子,关闭盖子以及启动。
public class WashClothes {
private User user;
private Machine machine;
public WashClothes(){
user = new User();
machine = new Machine();
}
public void wash(){
user.takeClothes();
machine.open();
user.putDownClother();
machine.close();
machine.start();
}
}
门面角色,提供了直接洗衣服的接口,使得客户端不用通过调用子系统的方式完成功能。
public static void main(String[] args) {
WashClothes washClothes = new WashClothes();
washClothes.wash();
}
可以看到,客户端直接通过门面角色的wash方法,完成了复杂的工作。
三、总结
外观模式的角色包括:
- facade:门面角色,外观模式的核心,客户端直接调用门面角色的接口,门面角色调用各个子系统的接口。
- 子系统角色:实现子系统的功能。
- 客户端:直接调用门面角色的接口。
外观模式的优点:对于客户端来说,屏蔽了子系统,降低了系统的耦合性。
外观模式的缺点:无法限制客户端对子系统的访问。此外,如果设计不当,新增子系统时可能需要修改门面角色的代码,导致违背开闭原则。