专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java设计模式学习总结:外观模式(java设计模式装饰)

temp10 2024-09-03 21:52:06 java教程 15 ℃ 0 评论

一、概述

在实际的项目中,有时候一个客户类需要和多个业务类交互,如果这个客户类和每个业务类都有交互,那么类之间的交互过于复杂,如果为多个业务类的调用提供了一个统一的入口,那么则简化了类与类之间的交互,如下图所示:

Java设计模式学习总结:外观模式(java设计模式装饰)


如上图的经过外观模式设计的变换过程之后,客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。

所以如果没有外观类,每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大;如果引入外观类,客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度。

二、外观模式的定义

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。Facade Pattern: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.


外观模式通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度,符合迪米特法则。其结构如下所示:


三、案例

本资料案例主要学习 《设计模式第二版 中南大学 刘伟》之后总结,此案例专业、典型,故引用之。其中程序学习总结者亲自在myEclipse8.5版本调试通过,注意在这里所有的类和接口写在一个Java文件里面,除了主类其它类和接口不能声明为public的,主要是提醒出道时间不长的读者,以免造成学习上的麻烦,但重在多试,有问题是好事。


《电源总开关》案例:现在考察一个电源总开关的例子,以便进一步说明外观模式。为了使用方便,一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。通过该电源总开关可以同时控制上述所有电器设备,使用外观模式设计该系统。


package com.test;

public class Test {


public static void main(String[] args) {

GeneralSwitchFacade gsf=new GeneralSwitchFacade();

gsf.on();

System.out.println("-----------------------");

gsf.off();

}


}


class Light

{

private String position;


public Light(String position)

{

this.position=position;

}


public void on()

{

System.out.println(this.position + "灯打开!");

}


public void off()

{

System.out.println(this.position + "灯关闭!");

}

}


class Fan

{

public void on()

{

System.out.println("风扇打开!");

}


public void off()

{

System.out.println("风扇关闭!");

}


}


class AirConditioner

{

public void on()

{

System.out.println("空调打开!");

}


public void off()

{

System.out.println("空调关闭!");

}

}


class Television

{

public void on()

{

System.out.println("电视机打开!");

}


public void off()

{

System.out.println("电视机关闭!");

}

}


class GeneralSwitchFacade {

private Light lights[]=new Light[4];

private Fan fan;

private AirConditioner ac;

private Television tv;


public GeneralSwitchFacade()

{

lights[0]=new Light("左前");

lights[1]=new Light("右前");

lights[2]=new Light("左后");

lights[3]=new Light("右后");

fan=new Fan();

ac=new AirConditioner();

tv=new Television();

}


public void on()

{

lights[0].on();

lights[1].on();

lights[2].on();

lights[3].on();

fan.on();

ac.on();

tv.on();

}


public void off()

{

lights[0].off();

lights[1].off();

lights[2].off();

lights[3].off();

fan.off();

ac.off();

tv.off();

}

}


运行结果:


外观模式优点:

1、它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易

2、它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可

3、一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象


外观模式缺点:

1、不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性

2、如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表