外观模式可以理解为为系统增加一个外观类,这个外观类就是类似于网站的主页,相当于用户不用再与网站的子网页交互,而只需要与主页交互,可以理解为一个总的控制中心,用户和子系统的复杂关系由外观角色来实现,从而降低了系统的耦合度。
外观模式组成:外观角色,子系统角色,客户端。
//子系统角色
public class AirCondition {
public void on(){
System.out.println("空调打开");
}
public void off(){
System.out.println("空调关闭");
}
}
public class Fan {
public void on(){
System.out.println("风扇打开");
}
public void off(){
System.out.println("风扇关闭");
}
}
public 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 + "灯关闭");
}
}
public class Television {
public void on(){
System.out.println("电视打开");
}
public void off(){
System.out.println("电视关闭");
}
}
//外观角色类
public class SwitchFacade {
private Light lights[] = new Light[4];
private Fan fan;
private AirCondition ac;
private Television tv;
public SwitchFacade(){
lights[0] = new Light("左前");
lights[1] = new Light("右前");
lights[2] = new Light("左后");
lights[3] = new Light("右后");
fan = new Fan();
ac = new AirCondition();
tv = new Television();
}
public void on(){
for(int i = 0; i < lights.length; i ++){
lights[i].on();
}
fan.on();
ac.on();
tv.on();
}
public void off(){
for(int i = 0; i < lights.length; i ++){
lights[i].off();
}
fan.off();
ac.off();
tv.off();
}
}
//客户端
public class Client {
public static void main(String[] args){
SwitchFacade sw = new SwitchFacade();
sw.on();
}
}
文件加密
public class Client
{
public static void main(String args[])
{
EncryptFacade ef=new EncryptFacade();
ef.fileEncrypt("444", "555");
}
}
public class EncryptFacade
{
private FileReader reader;
private CipherMachine cipher;
private FileWriter writer;
public EncryptFacade()
{
reader=new FileReader();
cipher=new CipherMachine();
writer=new FileWriter();
}
public void fileEncrypt(String fileNameSrc,String fileNameDes)
{
String plainStr=reader.read(fileNameSrc);
String encryptStr=cipher.encrypt(plainStr);
writer.write(encryptStr, fileNameDes);
}
}
public class FileReader {
public String read(String fileNameSrc)
{
return fileNameSrc;
}
}
public class FileWriter {
public void write(String encryptText,String fileNameDes)
{
System.out.println(encryptText);
System.out.println(fileNameDes);
}
}
外观模式优点:
(1)外观模式并不给系统增加新功能,它仅仅是增加一些简化的接口,对客户端屏蔽子系统组件,减少客户处理的对象数,并使得得子系统使用起来更加容易。通过引入外观模式,客户端的代码将变简单,使其关联的对象也很少。
(2)只是提供一个访问子系统的统一入口,并不影响客户端直接调用子系统。
外观模式适用环境:
(1)客户程序与子程序有很大的依赖性。引入外观类将子程序与客户解耦,提高子程序和客户程序的移植性。
在外观模式中通常只有一个是外观类,并且外观类只有一个实例,换而言之它是一个单例类。但是不是说一个系统只能由一个外观类。
注意:不要通过外观类为子系统增加新行为,这样会使得系统很难读懂。
外观模式最大的缺点是违背了“开闭原则”,当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决这个问题,客户端针对抽象外观类来编程,对于新业务只需要增加一个新的具体的外观类即可。