二十三种设计模式——外观模式

前页:设计模式总述


当我们设计软件的时候,难免要分工合作。比如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. 减少系统相互依赖。 (某一个方法错了不会相互影响或使整个程序崩溃)
  2. 提高灵活性。
  3. 提高了安全性。(同1)
  • 缺点
  1. 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值