设计模式之外观模式
外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,使子系统更容易使用。
应用场景
因为子系统随着发展会变更的更复杂,客户端想更简单统一给子系统建立一个公共的调用方式。这样即使子系统的再增加可重用性而变得更加复杂,客户端也不必知道,因为客户端往往不需要针对某一个子系统进行特定的定制化。
实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
例子中,每次开机的时候都要启动mysql,apache服务,两个还好,要是有更多服务岂不是很恼人,每次都要敲一大堆命令来开启服务。这时候可以使用外观模式,将所有服务加入到外观类中,每次开机只用调用外观类中的接口就行了。来达到简化客户端使用的目的。
代码
子系统接口
public interface Services {
void start();
void stop();
void restart();
}
mysql服务
public class MysqlService implements Services {
@Override
public void start() {
System.out.println("mysql is started");
}
@Override
public void stop() {
System.out.println("mysql is stopped");
}
@Override
public void restart() {
System.out.println("mysql is restart");
}
}
apache服务
public class ApacheService implements Services {
@Override
public void start() {
System.out.println("apache is started");
}
@Override
public void stop() {
System.out.println("apache is stopped");
}
@Override
public void restart() {
System.out.println("apache is restart");
}
}
外观类
public class Facade {
List<Services> services;
public Facade() {
services = new ArrayList<>();
}
public void addService(Services services){
this.services.add(services);
}
public void start(){
for (Services services : this.services){
services.start();
}
}
public void stop(){
for (Services services : this.services){
services.stop();
}
}
public void restart(){
for (Services services : this.services){
services.restart();
}
}
}
客户端调用
public class App {
public static void main(String[] args) {
Facade facade = new Facade();
facade.addService(new MysqlService());
facade.addService(new ApacheService());
facade.start();
facade.stop();
}
}
结果
mysql is started
apache is started
mysql is stopped
apache is stopped