您的位置:首页 > 编程语言 > Java开发

java设计模式之-----外观模式(门面模式)

2017-12-18 00:00 537 查看
摘要: java、设计模式、外观模式、门面模式

一、外观模式的定义

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

特性:外观模式很好的体现了面向对象的封装特性。

二、场景假设

在生活中,汽车作为一种交通工具。也是社会生产进步的产物标志。不得不说汽车的底层实现原理和我们生活中接触到的汽车操作相比,无疑是经过高度封装的产物。下面我们就来模拟汽车操作原理来讲解外观模式。我们先将汽车的主要两个子系统进行说明:发动机、变速箱。我们在将我们平时操作汽车发动机的几个主要步骤进行抽象,大致可以分为以下几个步骤。对发动机的操作:1、发动机启动、2、给油、3、关闭发动机。对变速箱的操作:换挡(为了方便说明我们把采离合放进变速箱系统中来)。其他无关紧要的模块我们把它放在其他系统中。我们把汽车的主要几部操作抽象为驾考中的几部:灯、档、号、刹,将这几部暴露成接口。针对这几个子系统和操作我们来创建不同子系统对应的类和提供这几部操纵的门面接口。

三、代码实现

1、创建发动机子系统类

package com.pattern.facade;

/**
* 发动机类,代表发动机子系统
* @author dgw
*
*/
public class Engine {

//自动启动
public Engine(){
this.start();
}

public void start(){
System.out.println("发动机启动");
}

public void comeOn(){
System.out.println("给油");
}

public void close(){
System.out.println("关闭发动机");
}
}

2、创建其他系统类

package com.pattern.facade;

public class OtherSystem {

//灯属于其他子系统
public void deng() {
System.out.println("打开灯");
}

//号属于其他子系统
public void hao() {
System.out.println("鸣笛");
}

//刹属于其他子系统
public void sha() {
System.out.println("放开刹车");
}
}

3、创建对用户暴露的接口

package com.pattern.facade;
/**
* 汽车操作接口:只暴露出主要的这几部
* @author dgw
*
*/
public interface IFacade {

//灯
void deng();

//档
void dan();

//号
void hao();

//刹
void sha();
}

4、创建门面对象类

package com.pattern.facade;

/**
* 门名对象:
* @author dgw
*
*/
public class IFacadeImpl implements IFacade {

PackageCar p=new PackageCar();

//灯属于其他子系统
@Override
public void deng() {
p.deng();
}

//档属于变速箱子系统
@Override
public void dan() {
p.dan();
}

//号属于其他子系统
@Override
public void hao() {
p.hao();
}

//刹属于其他子系统
@Override
public void sha() {
p.sha();
}

}

5、创建变速箱系统

package com.pattern.facade;
/**
* 变速箱子系统类
* @author dgw
*
*/
public class Speed {

//踩离合
void clh(){
System.out.println("踩离合");
}

//换挡
void  huandan(){
System.out.println("换挡");
}

//档
void dan(){
this.clh();
this.huandan();
}

}

6、创建汽车包装类,相当于汽车大梁。

package com.pattern.facade;
/**
* 封装汽车的子系统,实现调用灯、档、号、刹中任意
* 一个方法时保证他前面的步骤已经开始。
* @author dgw
*
*/
public class PackageCar {

Engine engine=new Engine();
OtherSystem other=new OtherSystem();
Speed speed= new Speed();

//灯属于其他子系统
public void deng() {
other.deng();
}

//档属于变速箱子系统
public void dan() {
this.deng();
speed.dan();
}

//号属于其他子系统
public void hao() {
this.dan();
other.hao();
}

//刹属于其他子系统
public void sha() {
this.hao();
other.sha();
engine.comeOn();//扩展给油
}

}

7、创建汽车操作接口测试类

package com.pattern.facade;

import org.junit.Test;

/**
* 测试类,测试汽车造作接口
* @author dgw
*
*/
public class TestFacade {

//测试灯
@Test
public void testDeng(){
IFacade  facade=new IFacadeImpl();
facade.deng();
//   发动机启动
//   打开灯
}

//测试档
@Test
public void testDan(){
IFacade  facade=new IFacadeImpl();
facade.dan();
//		发动机启动
//		打开灯
//		踩离合
//		换挡
}

//测试号(鸣笛)
@Test
public void testHao(){
IFacade  facade=new IFacadeImpl();
facade.hao();
//		发动机启动
//		打开灯
//		踩离合
//		换挡
//		鸣笛
}

//测试刹车
@Test
public void testSha(){
IFacade  facade=new IFacadeImpl();
facade.sha();
//		发动机启动
//		打开灯
//		踩离合
//		换挡
//		鸣笛
//		放开刹车

}

}

8、以上方式封装子系统,如果想在任何一个环节之内添加一个新环节,比如:放开刹车后加油,只需要在PackageCar调用sha()方法中调用下engine.comeOn();实现很方便的扩展。

package com.pattern.facade;
/**
* 封装汽车的子系统,实现调用灯、档、号、刹中任意
* 一个方法时保证他前面的步骤已经开始。
* @author dgw
*
*/
public class PackageCar {

Engine engine=new Engine();
OtherSystem other=new OtherSystem();
Speed speed= new Speed();

//灯属于其他子系统
public void deng() {
other.deng();
}

//档属于变速箱子系统
public void dan() {
this.deng();
speed.dan();
}

//号属于其他子系统
public void hao() {
this.dan();
other.hao();
}

//刹属于其他子系统
public void sha() {
this.hao();
other.sha();
engine.comeOn();//扩展给油
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: