微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift - The Proxy Pattern

I describe the proxy pattern in this chapter,which is used when an object is required to act as an interface to another object or resource. There are three main ways in which the proxy pattern is applied,and I describe each of them and show you how to implement them.


XcodeFoundation的经典delegate亦复如是。

我在实际工作中vc也仿照过Foundation的delegate:

button:内涵业务逻辑,底层实现;每个button是一个类,业务逻辑需要未知的参数和处理之后未知的结果反馈

UI:点击button之后界面的改变,UI实现未知的参数未知的结果反馈,也就是实现这个代理

这样以来UI的定制,很灵活很容易,代码思路依然清晰如初。


哪个是主体哪个是代理并不重要关键是看定义所说which is used when an object is required to act as an interface to another object or resource.

这个代理模式是结构模式中的一种,所以使用这个模式之后代码结构会非常清晰。


client:

import Foundation;


let url = "http://www.apress.com";

let headers = ["Content-Length","content-encoding"];


let proxy = AccessControlProxy(url: url);


for headerinheaders {

proxy.getHeader(header,callback: {header,valin

if (val !=nil) {

println("\(header):\(val!)");

}

});

}


UserAuthentication.sharedInstance.authenticate("bob",pass:"secret");

proxy.execute();


NSFileHandle.fileHandleWithStandardInput().availableData;



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

pattern:

//1

import Foundation;


protocol HttpHeaderRequest {

init(url:String);

func getHeader(header:String,callback:(String,String?) -> Void );

func execute();

}


class AccessControlProxy :HttpHeaderRequest {

privatelet wrappedobject:HttpHeaderRequest;

requiredinit(url:String) {

wrappedobject =HttpHeaderRequestProxy(url: url);

}

func getHeader(header:String,callback: (String,String?) -> Void) {

wrappedobject.getHeader(header,callback: callback);

}

func execute() {

if (UserAuthentication.sharedInstance.authenticated) {

wrappedobject.execute();

}else {

fatalError("Unauthorized");

}

}

}


privateclass HttpHeaderRequestProxy :HttpHeaderRequest {

let url:String;

var headersrequired:[String: (String,String?) -> Void];

requiredinit(url:String) {

self.url = url;

self.headersrequired =Dictionary<String,(String,String?) ->Void>();

}

func getHeader(header:String,String?) -> Void) {

self.headersrequired[header] = callback;

}

func execute() {

let nsUrl =NSURL(string:url);

let request =NSURLRequest(URL: nsUrl!);

NSURLSession.sharedSession().dataTaskWithRequest(request,

completionHandler: {data,response,errorin

iflet httpResponse = responseas?NSHTTPURLResponse {

let headers = httpResponse.allHeaderFieldsas! [String:String];

for (header,callback)in self.headersrequired {

callback(header,headers[header]);

}

}

}).resume();

}

}



//2

class UserAuthentication {

var user:String?;

var authenticated:Bool =false;

private init() {

// do nothing - stops instances being created

}

func authenticate(user:String,pass:String) {

if (pass =="secret") {

self.user = user;

self.authenticated =true;

}else {

self.user =nil;

self.authenticated =false;

}

}

classvar sharedInstance:UserAuthentication {

get {

struct singletonWrapper {

staticlet singleton =UserAuthentication();

}

returnsingletonWrapper.singleton;

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。