博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带授权的友元访问限制
阅读量:4297 次
发布时间:2019-05-27

本文共 949 字,大约阅读时间需要 3 分钟。

最近看了一篇博文,文中作者对于访问控制的一个点感觉讲的很对。问题场景如下:

对于某些创建过程较为复杂的类,我们通常借助于工厂方法创建、获取对象,以封装复杂的创建过程。所以在技术实现上需要将待创建类型的构造函数定义为私有,并将工厂类定义为该待创建类型的友元。

class Secret{	// 将工厂类生命为友元	friend class SecretFactory;private:     // 私有构造函数	Secret() 	{	}	//类内定义的其他私有接口	void secretMethod()	{	}};class SecretFactory{public:	static Secret* GetSecret(const std::string& type)	{		auto* ptr_secret = new Secret();		// 这是作甚	   ptr_secret->secretMethod();		return ptr_secret ;	}};

这样的实现其实从使用来将没有问题。但如果将访问控制再细化一下,其实是有问题的。对SecretFactory类创建对象而言,Secret类只需要开放给它构造函数的访问权限即可,可一旦生命为友元,所有的Secret的私有接口工厂类均可访问,开放的权限过大了。所以文中作者提出了密钥授权的方式,密钥的创建做了限制,而可访问的接口需要传入密钥对象,从而限定了可访问接口的范围,思路上很是巧妙:

// 引入了中间密钥类型struct SecretKey{	// 对密钥的获取做授权控制	friend class SecretFactory;private: 	SecretKey();};class Secret{public:	// 对象的创建需要带密钥参数	Secret(const SecretKey& key);	void secretMethod()	{	}};class SecretFactory{public:	static Secret* GetSecret(const std::string& type);};

当然上述实现也是有代价的,一是引入了新的中间类,二是对Secret类而言多了一个功能实现无关参数。

转载地址:http://upcws.baihongyu.com/

你可能感兴趣的文章
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>
iPhone开发学习笔记002——Xib设计UITableViewCell然后动态加载
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>
iOS开发的一些奇巧淫技
查看>>
常浏览的博客和网站
查看>>
Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
查看>>
点击button实现Storyboard中TabBar Controller的tab切换
查看>>
Xcode 的正确打开方式——Debugging
查看>>
打包app出现的一个问题
查看>>
iOS在Xcode6中怎么创建OC category文件
查看>>
Expanding User-Defined Runtime Attributes in Xcode with Objective-C
查看>>
iOS7 UITabBar自定义选中图片显示为默认蓝色的Bug
查看>>
提升UITableView性能-复杂页面的优化
查看>>