设计模式之-----外观模式

今天学习了外观模式,给我第一感觉就是。。。。没感觉,之后自己做demo的时候才发现,自己学完之后没有感觉就是因为平时用的太多了,以前没有模式的概念,自然不往这个方面去想,现在学完之后,发现自己很早之前就会了,所以就没什么感觉。。

好,言归正传,所谓的外观模式,主要目的我感觉就是解耦,比如我们有三个不同的类,客户需要完成的工作需要这三个类来一起完成,怎么办呢?把这三个类暴露给客户么?那样的话,耦合度就太高了,那么怎么才能使他们之间耦合减少呢?那就是使用外观模式,外观模式通过给外界(或者客户)暴露一个统一的类,来完成固定的工作,在这期间,客户无需知道细节,只要调用这个类的这个方法,最后得到结果即可。

我感觉我说了这么多,大家还是可能不太明白,那么我就用一个例子来说明一下(这个例子用的不太好,写的比较匆忙,还请见谅)

我们每个人都去饭店吃过饭,我们进饭店之后,拿起菜单点菜比如要点一碗米饭,按照正常的逻辑,我们会在意这个大米是东北产的还是海南产的么?(大家不要较真,说的是这个意思),我们甚至什么都不关心,反正最后服务员把米饭端上来,我们吃,就够了。同样的,蔬菜,鱼,都是这样。如果我们吃的每一样东西都要知道这个东西生产制作的细节,那么吃顿饭会把我们累死。。。

我们先看一下包结构


下边是代码

package com.facade.sub;

/**
 * 米饭类,在整个系统中充当子系统的角色
 * @author ZHENGWEI
 * @date Jul 25, 2015
 */
public class Rice {

	public void zheJiang(){
		System.out.println("这是浙江生产的大米");
	}
	
	public void jiangSu(){
		System.out.println("这是江苏生产的大米");
	}
	
	public void doRice(){
		System.out.println("把大米做成米饭");
	}
}

package com.facade.sub;

/**
 * 鱼类,作用也是充当子系统,与米饭类平级
 * @author ZHENGWEI
 * @date Jul 25, 2015
 */
public class Fish {

	public void hangZhou(){
		System.out.println("这是杭州的鱼");
	}
	
	public void doFish(){
		System.out.println("把鱼炖熟了");
	}
}

package com.facade.sub;

/**
 * 蔬菜类,与之前两个类一样
 * @author ZHENGWEI
 * @date Jul 25, 2015
 */
public class Vegetables {

	public void doVeg(){
		System.out.println("鱼香肉丝");
	}
	
	public void doVeg1(){
		System.out.println("木须肉");
	}
}

好,我们写完了这三个类,如果我们点菜的时候,要直接new 这几个类,那么我们还有了解他们的细节,太麻烦了。所以Facade就充当了菜单的角色

package com.facade.facade;

import com.facade.sub.Fish;
import com.facade.sub.Rice;
import com.facade.sub.Vegetables;

/**
 * 吃饭类,吃饭的选择有多种,在此做统一的调用
 * @author ZHENGWEI
 * @date Jul 25, 2015
 */
public class EatFacade {

	/**
	 * 我们吃饭的时候,并不关心米饭是哪里生产的,鱼是哪里的
	 * 我们最终的目的就是吃掉它
	 */
	
	private Rice rice;
	private Fish fish;
	private Vegetables veg;
	
	public EatFacade(){
		this.rice = new Rice();
		this.fish = new Fish();
		this.veg = new Vegetables();
	}
	
	
	public void riceAndFish(){
		rice.zheJiang();
		rice.doRice();
		fish.hangZhou();
		fish.doFish();
	}
	
	public void riceAndVeg(){
		rice.zheJiang();
		rice.doRice();
		veg.doVeg();
	}
	
	public void riceAndVeg1(){
		rice.zheJiang();
		rice.doRice();
		veg.doVeg1();
	}
}

最后是测试类

package com.facade.main;

import com.facade.facade.EatFacade;

public class FacadeMain {

	public static void main(String[] args) {
		EatFacade eatFacade = new EatFacade();
		eatFacade.riceAndFish();
		System.out.println("===============================");
		eatFacade.riceAndVeg();
		System.out.println("===============================");
		eatFacade.riceAndVeg1();
		System.out.println("===============================");
	}

}

也就是说,我们吃饭的时候,只要看菜单就可以了,剩下的事情是出事要做的事情,我们等着吃就ok了。所以,客户只需要与菜单发生耦合,而不必与具体的某个事物发生关系。

最后的结果:


最后,引用其他博客上的几句话,这是我在学习过程中看到的,希望对大家有帮助:

1、外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。

2、外观模式实现了子系统与客户之间的松耦合关系。

3、外观模式没有封装子系统的类,只是提供了简单的接口。 如果应用需要,它并不限制客户使用子系统类。因此可以再系统易用性与通用性之间选择。

4、外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值