频道栏目
首页 > 资讯 > 其他 > 正文

设计模式:外观模式

16-11-23        来源:[db:作者]  
收藏   我要投稿

外观模式:

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

涉及设计模式:

1.最少知识原则:只和你的密友谈话。

2.为交互对象之间的松耦合设计而努力。

问题简单描述:

有一个简单的家庭影院,有电灯、屏幕、投影仪、DVD,但是需要看电影的时候却需要主人做很多事情,打开电灯、调暗灯光、放下屏幕、打开投影仪、打开DVD、播放DVD,电影结束之后也需要做很多事情,能不能只要告诉家庭影院,我需要看电影,家庭影院就可以自动做那些事情。

解决思路:

增加一个家庭影院外观类,组合了电灯、屏幕、投影仪、DVD,调用者只需要调用家庭影院的看电影方法,其他的都交给家庭影院来做,不需要知道具体的电灯、屏幕等的具体实现。

UML图:

实现代码:

组件接口

package facade;

/**
 * 电灯接口
 * @author terry
 *
 */
public interface Light {
	//关灯
	void off();
	//调节亮度
	void dim(int percentage);
	//开灯
	void on();

}
package facade;

/**
 * 屏幕接口
 * @author terry
 *
 */
public interface Screen {
	//上升
	void up();
	//下降
	void down();

}
package facade;

/**
 * 投影仪接口口
 * @author terry
 *
 */
public interface Projector {
	//开投影仪
	void on();
	//关投影仪
	void off();

}
package facade;

/**
 * DVD接口
 * @author terry
 *
 */
public interface DVD {
	//打开dvd
	void on();
	//关闭dvd
	void off();
	//播放影片
	void play(String movie);

}

组件实现类

 

package facade;

/**
 * 家用灯
 * @author terry
 *
 */
public class HomeLight implements Light{

	@Override
	public void off() {
		System.out.println("Home Light is off");
	}

	@Override
	public void dim(int percentage) {
		System.out.println("Home Light turn "+percentage+" percente dim");
	}

	@Override
	public void on() {
		System.out.println("Home Light is on");
	}

}
package facade;

/**
 * 家用屏幕
 * @author terry
 *
 */
public class HomeScreen implements Screen{

	@Override
	public void up() {
		System.out.println("Home Screen is up");
	}

	@Override
	public void down() {
		System.out.println("Home Screen is down");
	}

}
package facade;

/**
 * 家用投影仪
 * @author terry
 *
 */
public class HomeProjector implements Projector{

	@Override
	public void on() {
		System.out.println("Home Projector is on");
	}

	@Override
	public void off() {
		System.out.println("Home Projector is off");
	}

}
package facade;

/**
 * 家用DVD
 * @author terry
 *
 */
public class HomeDVD implements DVD{

	@Override
	public void on() {
		System.out.println("Home DVD is on");
	}

	@Override
	public void off() {
		System.out.println("Home DVD is off");
	}

	@Override
	public void play(String movie) {
		System.out.println("Home DVD is playing "+movie);
	}
}

测试类

package facade;

public class Test {
	public static void main(String[] args) {
		//家庭影院所需组件
		Light light = new HomeLight();
		Screen screen = new HomeScreen();
		Projector projector = new HomeProjector();
		DVD dvd=new HomeDVD();
		//创建家庭影院
		HomeTheaterFacade homeTheaterFacade=new HomeTheaterFacade(light, screen, projector, dvd);
		//轻松看电影
		homeTheaterFacade.startWatchMovie();
		homeTheaterFacade.endWatchMovie();
	}

}

运行结果


外观模式就是为了实现更简单的接口。当需要简化并统一一个很大的接口或者一群复杂的接口时,提供一个外观类将系统中的所有组件组合,调用者只需要调用外观类就可以实现一个功能。这个功能的实现其实需要用很多接口,但是调用着只需要调用外观类,并不需要知道功能实现中的众多接口具体怎么实现,这样就达到了松耦合效果。有了外观之后当需要的时候仍然可以直接调用底层的组件接口。
相关TAG标签
上一篇:Qt:udp的初始化及数据接收
下一篇:病毒预警_魔波广告恶意病毒简析
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站