有一次,我为了实现在iphone和pc之间能够随意通过网上邻居互相访问,在两边分别安装和配置ssh,rsycn,samba服务和客户端,并互相分发公钥和私钥以满足不用每次输入密码的需要,当时在网上查阅了数十篇相关技术帖,结果居然没有一篇帖子是对的,中间碰壁无数次,最后才摸索出正确方法,在大功告成那一刻,我突然发现其实这本来是非常简单的事情,三言两语就可以讲得清清楚楚,结果偏偏被不擅表达的技术人员写得夹缠不清,让人晕头转向,我回顾多年来看过的所有技术书籍或文章,其实大部分都是这样,明明很简单的东西,总是表述得复杂无比,因此我决定把一些重要的软件开发知识整理出来,用最简洁明了的方式来表达,使人们可以轻松的理解和记住这些原本就很简单的东西。
Singleton Pattern:单件模式
目的:让这个类在整个应用中永远只有唯一的一个实例。
思路:1:用一个类型为自身的静态实例变量来作为该类的全局唯一实例,并在声明变量时创建该实例,使该实例一开始就存在;
2:使构造函数私有,使调用者无法从外部创建新实例;
3:提供一个“获取实例”方法供外部用户访问这个全局唯一实例。
Adapter Pattern:适配器模式
目的:当一个类要调用另一个类,被调用接口却不匹配时,我们增加一个符合调用要求的适配器类,调用方按接口规范调用适配器类即可,而对原本不符合调用要求的被调用类的访问则封装到适配器的内部逻辑中。
思路:
变换:以上是最简单的形式,用于解决指被调用类的提供的API函数接口和调用类不匹配,实际上基于“面向接口编程而不是面向实现”的原则,有时适配器被定义成接口和实现两个层次,不符合要求的被调用方的接口有时也是通过interface来提供的,这种情况下适配器模式的表现形式是:
目的:通常我们可以用继承的方式扩展一个基类的功能,而类的某些功能常常会有多种实现,当这两种需求同时出现时,桥接模式使我们可以把这两方面的程序分别封装到两个部分中去而不会混淆。
思路:1:我们把扩展功能的部分封装为“功能扩展类”。
2:我们把有多种实现的部分提取出来封装到一个“抽象实现类”,然后把多种不同的实现封装到各个“具体实现类”中。
3:我们在基类中声明以各种“具体实现类”为参数的构造方法,以便于指定在需要用功能类的多实现功能时采用哪种实现。
案例:在进行架构设计时为子系统提供一个开放的“扩展层”,把各种多实现功能类封装为一个独立的“实现层”。
改进:功能扩展层未必一定要用继承,其实用聚合更好,抽象实现类也可以是接口。
Visitor Pattern:访问者模式