【Android-设计模式】建造者模式

【Builder模式定义】:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Builder模式中的角色:

  • Produt产品类
  • Builder: 抽象Builder
  • ConcreteBuilder:具体Builder
  • Director:统一组装过程
    以上是经典的Builder模式中的角色。然而,我在项目中常见的用法简化 了Builder模式的设计:通常是一类中包含一个名为Builder的静态内部类, 这个静态内部类包含一个外部类的成员、一堆设置参数的方法、和一个用于产生外部类build()方法。这样,外部类和内部类分别负责表示和建造。

实战


public class StreamConfiguration {
    public static final int INVALID_APP_ID = 0;

    public static final int STREAM_CFG_LOCAL = 0;
    public static final int STREAM_CFG_REMOTE = 1;
    public static final int STREAM_CFG_AUTO = 2;

    private static final int CHANNEL_COUNT_STEREO = 2;
    private static final int CHANNEL_COUNT_5_1 = 6;
    
    private static final int CHANNEL_MASK_STEREO = 0x3;
    private static final int CHANNEL_MASK_5_1 = 0xFC;
    
    private NvApp app;
    private int width, height;
    private int refreshRate;
    private int clientRefreshRateX100;
    private int bitrate;
    private boolean sops;
    private boolean enableAdaptiveResolution;
    private boolean playLocalAudio;
    private int maxPacketSize;
    private int remote;
    private int audioChannelMask;
    private int audioChannelCount;
    private int audioConfiguration;
    private boolean supportsHevc;
    private int hevcBitratePercentageMultiplier;
    private boolean enableHdr;
    private int attachedGamepadMask;

    public static class Builder {
        private StreamConfiguration config = new StreamConfiguration();
        
        public StreamConfiguration.Builder setApp(NvApp app) {
            config.app = app;
            return this;
        }
        
        public StreamConfiguration.Builder setRemoteConfiguration(int remote) {
            config.remote = remote;
            return this;
        }
        
        public StreamConfiguration.Builder setResolution(int width, int height) {
            config.width = width;
            config.height = height;
            return this;
        }
        
        public StreamConfiguration.Builder setRefreshRate(int refreshRate) {
            config.refreshRate = refreshRate;
            return this;
        }
        
        public StreamConfiguration.Builder setBitrate(int bitrate) {
            config.bitrate = bitrate;
            return this;
        }
        
        public StreamConfiguration.Builder setEnableSops(boolean enable) {
            config.sops = enable;
            return this;
        }
        
        public StreamConfiguration.Builder enableAdaptiveResolution(boolean enable) {
            config.enableAdaptiveResolution = enable;
            return this;
        }
        
        public StreamConfiguration.Builder enableLocalAudioPlayback(boolean enable) {
            config.playLocalAudio = enable;
            return this;
        }
        
        public StreamConfiguration.Builder setMaxPacketSize(int maxPacketSize) {
            config.maxPacketSize = maxPacketSize;
            return this;
        }

        public StreamConfiguration.Builder setHevcBitratePercentageMultiplier(int multiplier) {
            config.hevcBitratePercentageMultiplier = multiplier;
            return this;
        }

        public StreamConfiguration.Builder setEnableHdr(boolean enableHdr) {
            config.enableHdr = enableHdr;
            return this;
        }

        public StreamConfiguration.Builder setAttachedGamepadMask(int attachedGamepadMask) {
            config.attachedGamepadMask = attachedGamepadMask;
            return this;
        }

        public StreamConfiguration.Builder setAttachedGamepadMaskByCount(int gamepadCount) {
            config.attachedGamepadMask = 0;
            for (int i = 0; i < 4; i++) {
                if (gamepadCount > i) {
                    config.attachedGamepadMask |= 1 << i;
                }
            }
            return this;
        }

        public StreamConfiguration.Builder setClientRefreshRateX100(int refreshRateX100) {
            config.clientRefreshRateX100 = refreshRateX100;
            return this;
        }
        
        public StreamConfiguration.Builder setAudioConfiguration(int audioConfig) {
            if (audioConfig == MoonBridge.AUDIO_CONFIGURATION_STEREO) {
                config.audioChannelCount = CHANNEL_COUNT_STEREO;
                config.audioChannelMask = CHANNEL_MASK_STEREO;
            }
            else if (audioConfig == MoonBridge.AUDIO_CONFIGURATION_51_SURROUND) {
                config.audioChannelCount = CHANNEL_COUNT_5_1;
                config.audioChannelMask = CHANNEL_MASK_5_1;
            }
            else {
                throw new IllegalArgumentException("Invalid audio configuration");
            }

            config.audioConfiguration = audioConfig;

            return this;
        }
        
        public StreamConfiguration.Builder setHevcSupported(boolean supportsHevc) {
            config.supportsHevc = supportsHevc;
            return this;
        }
        
        public StreamConfiguration build() {
            return config;
        }
    }
    
    private StreamConfiguration() {
        // Set default attributes
        this.app = new NvApp("Steam");
        this.width = 1280;
        this.height = 720;
        this.refreshRate = 60;
        this.bitrate = 10000;
        this.maxPacketSize = 1024;
        this.remote = STREAM_CFG_AUTO;
        this.sops = true;
        this.enableAdaptiveResolution = false;
        this.audioChannelCount = CHANNEL_COUNT_STEREO;
        this.audioChannelMask = CHANNEL_MASK_STEREO;
        this.supportsHevc = false;
        this.enableHdr = false;
        this.attachedGamepadMask = 0;
    }
    
    public int getWidth() {
        return width;
    }
    
    public int getHeight() {
        return height;
    }
    
    public int getRefreshRate() {
        return refreshRate;
    }
    
    public int getBitrate() {
        return bitrate;
    }
    
    public int getMaxPacketSize() {
        return maxPacketSize;
    }

    public NvApp getApp() {
        return app;
    }
    
    public boolean getSops() {
        return sops;
    }
    
    public boolean getAdaptiveResolutionEnabled() {
        return enableAdaptiveResolution;
    }
    
    public boolean getPlayLocalAudio() {
        return playLocalAudio;
    }
    
    public int getRemote() {
        return remote;
    }
    
    public int getAudioChannelCount() {
        return audioChannelCount;
    }
    
    public int getAudioChannelMask() {
        return audioChannelMask;
    }

    public int getAudioConfiguration() {
        return audioConfiguration;
    }
    
    public boolean getHevcSupported() {
        return supportsHevc;
    }

    public int getHevcBitratePercentageMultiplier() {
        return hevcBitratePercentageMultiplier;
    }

    public boolean getEnableHdr() {
        return enableHdr;
    }

    public int getAttachedGamepadMask() {
        return attachedGamepadMask;
    }

    public int getClientRefreshRateX100() {
        return clientRefreshRateX100;
    }
}

  • StreamConfiguration 是一个配置类,有一堆参数,可以通过其实例进行访问,但不能通过实例修改参数
  • StreamConfiguration.builder是建造者,负责设置参数
  • 这样设计的意义在于不想对StreamConfiguration 实例暴露修改参数的方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值