一、应用
1.1 概念
外观模式是一种结构型的设计模式,该设计模式能够为你一些复杂类、复杂的框架提供一个简单的接口,这样对外只会暴露该框架的入口,不会暴露本身的复杂对象。
1.2 应用场景
假如你想在某个代码中将一些程序中的业务对象类结合到一起,按照某种特定的顺序去执行,或者不确定执行哪个类中的某个方法时就可以将该设计模型应用。
二、实现
2.1 Python代码实现
# Python实现的一种模式主要是利用python的eval特性实现对外暴露单一接口
from abc import abstractmethod, ABCMeta
class AbcProcess(metaclass=ABCMeta):
@abstractmethod
def run(self):
pass
class CalcProcess(AbcProcess):
def run(self):
print("calc")
class ModelProcess(AbcProcess):
def run(self):
print("model")
def faced(class_name):
"""
外观方法对外暴露的接口,调用这个接口让外部传入想要运行的类名,执行相应抽出来的方法
"""
return eval(class_name + "()")
if __name__ == '__main__':
class_name = "CalcProcess"
face = faced(class_name)
face.run()
2.2 JAVA实现
我们假设这样一个场景,我们需要将一个ogg后缀的视频转换成mp4结尾的视频,因为有的软件在线播放只支持mp4格式的软件,那我们如何设计出一个功能并对调用他的开发者只保留一个接口就可以实现呢?
example/Code.java
package example;
public interface Code {
}
example/Mp4Code.java
package example;
package example;
public class Mp4Code implements Code{
public String type = "mp4";
}
example/OggCode.java
package example;
public class OggCode implements Code{
public String type = "ogg";
}
example/VideoFile.java
package example;
public class VideoFile {
private String name;
private String CodeType;
public VideoFile(String name) {
this.name = name;
this.CodeType = name.substring(name.indexOf(".") + 1);
}
public String GetName() {
return name;
}
public String GetCode() {
return CodeType;
}
}
example/CodeFactory.java
package example;
public class CodeFactory {
public static Code extract(VideoFile file) {
String type = file.GetCode();
if (type.equals("mp4")) {
System.out.println("创建mp4对象");
return new Mp4Code();
} else {
System.out.println("创建ogg对象");
return new OggCode();
}
}
}
example/ByteChange.java
package example;
public class ByteChange {
public static VideoFile readFile(VideoFile file, Code code) {
System.out.println("二进制读取");
return file;
}
public static VideoFile writeFile(VideoFile buffer, Code code) {
System.out.println("二进制写入");
return buffer;
}
}
example/Mix.java
package example;
import java.io.File;
public class Mix {
public File mix(VideoFile result) {
System.out.println("音频增加混响");
return new File("temp");
}
}
example/Faced.java
package example;
import java.io.File;
// 外观模式对外暴露的接口
public class Faced {
public File convertVideo(String fileName, String format) {
System.out.println("外观模式接口运行");
VideoFile file = new VideoFile(fileName);
Code sourceCode = CodeFactory.extract(file);
Code designCode;
if (format.equals("mp4")) {
designCode = new Mp4Code();
} else {
designCode = new OggCode();
}
VideoFile buffer = ByteChange.readFile(file, sourceCode);
VideoFile changeResult = ByteChange.readFile(buffer, designCode);
File result = (new Mix()).mix(changeResult);
System.out.println("外观模式接口运行结束");
return result;
}
}
clientDemo.java
import example.*;
import java.io.File;
public class clientDemo {
public static void main(String[] args) {
Faced converter = new Faced();
File mp4Video = converter.convertVideo("qq_video.ogg", "mp4");
}
}