设计模式(外观模式)

一、应用

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");
    }
}

2.3 Golang实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值