当我们设计软件的时候,难免要分工合作。比如A开发服务器。B开发客户端。这种情况下,就有一个很常见的问题,A开发的服务器如何与B开发的客户端联系起来?一种方式就是,服务器端造好各种类,供客户端调用。这样,客户端不必知道服务器端如何实现的这些类和方法,也能使用到服务器提供的方法。
举个例子,我们要吃饭,就要买材料,烧水,热锅,切菜,做菜,吃饭。但是如果我们去餐厅,想吃什么告诉服务员服务员通知厨师,厨师去做饭,服务员再端上来。我们不必知道服务员怎么通知的厨师(口头通知还是利用电子设备),也不用知道厨师怎么做的饭,只需要等待服务员把饭端上来。这个情景中,服务员就是接口。
老规矩,外观模式是什么说明白了,我们上代码体验一下。
public class Chef {
public void makeFood(){
System.out.println("delicious meal");
}
}
public class Waiter {
public void informChef(){
new Chef().makeFood();
}
}
public class Consumer {
public static void main(String[] args) {
Waiter waiter = new Waiter();
waiter.informChef();
}
}
这个代码有点短,没有实际意义,但是可以帮助理解。我们加一点代码量:
public class Chef {
public void makeBurger(){
System.out.println("Humburgers");
}
public void makeSandwich(){
System.out.println("Sandwiches");
}
public void makeCola(){
System.out.println("Cola");
}
public void makeChips(){
System.out.println("Chips");
}
}
public class Waiter {
private String menu;
public Waiter(String menu){
this.menu = menu;
}
public void informChef(String menu){
Chef chef = new Chef();
boolean flag = false;
if(menu.equalsIgnoreCase("sandwich")){
chef.makeSandwich();
flag = true;
}
if(menu.equalsIgnoreCase("burger")){
chef.makeBurger();
flag = true;
}
if(menu.equalsIgnoreCase("Cola")){
chef.makeCola();
flag = true;
}
if(menu.equalsIgnoreCase("Chip")){
chef.makeChips();
flag = true;
}
if(flag == false){
System.out.println("Sorry, we don't serve " + menu);
}
}
}
public class Consumer {
private String foodWantToEat;
public Consumer(String foodWantToEat){
this.foodWantToEat = foodWantToEat;
}
public static void main(String[] args) {
//点餐过程
System.out.println("What do you wanna eat?");
Scanner scanner = new Scanner(System.in);
Consumer consumer = new Consumer(scanner.nextLine());
//服务员记录菜单
Waiter waiter = new Waiter(consumer.foodWantToEat);
//服务员通知厨师备餐
waiter.informChef(consumer.foodWantToEat);
}
}
总结一下:当我们在主类中进行点餐的时候,设计了简单的交互,因此代码增加了,但是逻辑很简单。实际上,也就主方法最后两行有用。因此,我们可以看到,假设Chef是服务器端,Waiter是联系服务器与客户端的类(也可以归为服务器端),那么,我们的Consumer类就是客户端。客户端只需要调用方法即可。
- 优点:
- 减少系统相互依赖。 (某一个方法错了不会相互影响或使整个程序崩溃)
- 提高灵活性。
- 提高了安全性。(同1)
- 缺点
- 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。