程序员的年初总括

2015年过去了,假使把自己过去几年的阅历连成线的话,过去这一年的弯道比过去三年的都多,感谢所有遭遇的人和事,这一年成长了众多,改变了累累。链接:我的博客。

适配器情势(Adapter Pattern)

回头发现时间太快,走的太慢

13年进入东边博雅,感觉这里就是一个“小腾讯”,Team
leader、后端、产品经营、基本上都来自腾讯。当时的心境还相比较简单,刚刚出来干活尽早,总以为以后还很远,博雅这里有我的前程么?努力就好,后来的工作还相比幸运,有机会经历一个品类的0到1。到新兴支付上的事情都能轻车熟路,最后多少个月有机会带队山东棋牌客户端支付。15年新年走了累累老板,包括自己的一点位leader也准备要相差,在我走后的多少个月听说公司某些单位早已在裁员了。在里面呆久了,发现自己忘记了时间的流逝,整理简历的时候猛然发现,已经出去干活快5年了,已经到一个相比较难堪的年华了,突然觉得想要将来好遥远,而时间却冷酷无情的来到了。后边的几个月时间我花了很长的时日总计过去这几年的得与失,我发现自己险些成了温水里的青蛙,在这边该学的都已经学到了,进步的上空已经没有了,“钱途”和前景都很不明朗,离开无疑是最正确的操纵。14年岁末某个深夜收下腾讯的面试通告,项目太忙也没怎么准备,我认为在博雅这两年的熟识可以搞定。后来才发现自家out了(前面8个月的时间一向在写lua,Android原生开发丢了8个月),莫名的慌张、迷茫,发现时间太快,提升太慢,离开是绝无仅有的出路。

在博雅两年多,总的来说依然拿到大于付出。感谢博雅在最彰着的随时收纳了本人,两年来,该大力的也极力了,该成长的也成长了。唯一不足的是:在这两年的时日里不曾做好定期的总计与沉思,从来在埋头工作却遗忘了希望天空,这是最大的遗憾。

用来消除不兼容性。我的台式机电脑的工作电压是20V,而我国的家庭用电是220V,怎么着让20V的台式机电脑可以在220V的电压下办事?答案是引入一个电源适配器(AC
Adapter)
,俗称充电器或变压器,有了这多少个电源适配器,生活用电和台式机电脑即可兼容(首要点在于,电脑工作电压和个人电压都无法被我们修改,所以我们引入了一个适配器,在不改动电脑工作电压和个体电压的事态下,使得电脑拿到了20V
输入电压,这就是适配器形式的严重性,即被适配的两方无法被改动)。在软件开发中,有时也设有类似那种不匹配的情景,我们也能够像引入一个电源适配器一样引入一个叫作适配器的角色来协调那一个存在不般配的结构,这种设计方案即为适配器模式。

说走就走的远足

自我发现在一个地方呆久了会挑起思考上的受制。我控制一个人背着包出来散步,想放空所有思想,带着一颗简单的心,离开这个呆溺爱太久的地点,没有计划,走到什么地方是哪儿,我觉得自身的人生中一定要有三回这样的阅历。
辞了职,背着包漫无目的的走了几个月,走过了诸多都会,假使有机遇,我还想再经历五遍。

图片 1 

一、介绍

适配器模式有目标适配器类适配器二种实现。在目标适配器格局中,适配器与适配者之间是涉嫌关系;在类适配器格局中,适配器与适配者之间是后续(或促成)关系。在其实付出中,对象适配器的施用功能更高。

遇见了豆瓣工程师和成品,一起组建开发团队

11月进来万科物业,和豆类的哥们联手组建集团,“革命”了6个月,不管结果什么,于自家而言收获太多了,一定是自个儿职业生涯中的一个重大事件。看到历史上最SB的代码设计和沉淀了连年黑历史的渣代码。阅坑无数,跌坑和填坑过程对渣代码程序员深痛恶绝,于是臆想和总括各样造坑者写代码时的思想和思维过程,意识到程序员职业素养的要紧,养成了代码洁癖。(关于程序员的功夫要说的太多,有时光足以写一篇小说专门总计这多少个)。

遇见豆瓣卓越的工作流程和工程师氛围形式。很幸运有机遇共同实施最流行的工具和沉思方法。大家把过多团队只是说说而已、很多团伙都无法坚定不移不懈抓好的code
reiew执行的很好,并且获益很大,尤其是在后来项目重写阶段发挥了很大的效率。关于这段经历,我多少个月前认真的下结论成了一篇著作:《在价值观行业努力着的互联网人》

很谢谢鑫哥(负责人)对自己的相信,工作部署上给自家中度的即兴。我偏离了还为我争取年初奖,虽然没争取到,已经优秀够意识了,感激涕零。

二、适用场景

     
在以下情形下可以设想使用适配器情势:
      
(1) 系统需要动用部分共处的类,而这一个类的接口(如方法名)不相符系统的需要,甚至从不那么些类的源代码。
      
(2) 想创设一个足以重复使用的类,用于与局部相互之间没有太大关系的局部类,包括一些恐怕在将来推荐的类一起坐班。

麦纳麦再见

 毕业就直接在布拉迪斯拉发,从早期的敬畏到新兴的谙习再到习惯,习惯了一个城池,它能给您带来安全感。说离开,先导终有着一种难于言表的情怀,文字很难描述清楚。曾经自己觉得,我不会相差这座城市,哪怕奋斗到老,因为这了有本人的兄弟朋友还有希望。直到离开,我才发觉一个都会所寄托的心理其实并不是那么厚重。或许是因为150公里的偏离在我看来并从未真的的相距,它就在自身后方,见证着走过的每一个步脚印。

三、对象适配器

入职UC(阿里巴巴活动事业群)

 我不得不认同,除了面试聊天过程还算愉悦之外,我大部分缘故是随着“阿里”这两个字来的,那一个年平素在小公司徘徊,该经历的都经历了。有空子看旁人简历、面试别人,我以为这是五次从另一个角度认识自己的机会,看着许多面试人的表现,我仿佛看到了千古畏畏缩缩的投机,恨不得想重回抽自己几巴掌。我立马就想,看看自己的经验,我又有何区别?旁人不知底您是什么人,来自何方,也不容许在一五个时辰的年华周到的问询您,这么些时候,我起来反省:我当即还是能博取哪些?我想要的是咋样?我说了算最先百折不回写博客,我认为自己应当要去大商厦经历一下。Alibaba移动事业群,我希望能在此间成功三点:
1
匠人的价值。这一年本人意识到职业素养的紧要性,很四人却把这东西玩坏了,很多个人不关注的确有造诣的开发者和尚未素养的开发者的价值分别,很多时候是因为产品要求不高,或者社团看不到那点。而我,希望这是一个立异的团伙,然后,作为一个程序员,真正的素养价值才能得以展示,才能得于进步。
2
影响力。希望团结出色的一些灵魂能影响到团体,希望这么些团伙能形成互动分享和熏陶的氛围。

3
和牛人共舞。带着谦卑之心,希望能从出色的人身上又五遍能学到很多事物。

3.1 UML类图

图片 2

在目的适配器格局结构图中带有如下多少个角色:
       ● Target(目的抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
       ● 艾达pter(适配器类)也被号称包装类:适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target举办适配,适配器类是适配器格局的为主,在目的适配器中,它经过连续Target并涉嫌一个艾达(Ada)ptee对象使两岸发生联系。
       ● 艾达ptee(适配者类):适配者即被适配的角色,它定义了一个早已存在的接口,这多少个接口需要适配,适配者类一般是一个具体类,包含了客户愿意接纳的工作方法,在好几情状下或者没有适配者类的源代码。

比如说自己在上家公司新写了一个棋牌游戏控件的类库,比较公司原本的麻将控件更加灵敏,我表显露来的接口也和原来的接口很不一样,可是出于旧的控件接口已经用在了成千上万地点,要所有改成新接口也不太现实,这时候我写的新接口就需要去适配旧的接口。在这里,我写的新接口就是适配者类Adaptee,公司旧有的接口就是适配的对象Target,而自我还索要写一个适配器艾达(Ada)pter,用新的接口来兑现旧有的接口,也就是适配的目的。那样公司的以前的代码就不需要修改接口,依旧采取旧的调用情势,可是接口的贯彻是用自家写的新接口实现的。

适配器格局的中坚是艾达(Ada)pter(适配器类)的编排,典型的靶子适配器类是:

C++ 

class Adapter : public Target // 继承Target类
{
private :
    Adaptee adaptee; //维持一个对适配者对象的引用 ,关联Adaptee类
public: 
    Adapter(Adaptee adaptee) {
        this->adaptee = adaptee;
    }

    void request() {
        adaptee.specificRequest(); //转发调用  
    }
};

博客与书单

距离博雅的这段日子我意识反思于总计优秀的重点,博客顺理成章的成了总括与反思的最好工具;同时有些技术性的总计或任何心体面会仍可以与人享受,何乐而不为?再者,作为一个程序员,这也是一个让旁人周密摸底你的好模式。(要是猎头说是通过我的博客了然到自己的,通常自己会更乐于和他连续联系下去)。
这一年成功了24篇公开博客。其中技术总计18篇,经历总括4篇,资料翻译2篇。
这年读过的书:
《重构》
《code
clean》
《编程之美》
《大道至简》
《人月神话》
《暗时间》
《思考,快于慢》
《一个的朝圣》

《时间简史》

时间过得迅速,我理解一眨眼之后又是2017,2018,2019… 

2016,希望又是成长与收获的一年。

3.2 代码实现

C++ 

#include <iostream>
using namespace std; 

// 抽象类
class Target
{
public: 
    virtual ~Target() {};
    // 目标方法
    virtual void request() = 0; 
};

class Adaptee
{
public:
    // 被适配的方法
    void specificRequest()
    {
        cout << "specificRequest()" << endl;
    }
};

class Adapter : public Target
{
public:
    Adapter()
    {
        p = Adaptee();
    }
    // 目标方法
    void request()
    {
        // 调用被适配的方法
        p.specificRequest();
    }
private: 
    Adaptee p; 
};

int main()
{
    Target& t = Adapter();
    t.request();
}

C#

using System;
using System.Collections.Generic;
class Program
{
    interface Target
    {
        // 目标接口
        void request(); 
    }

    class Adaptee
    {
        // 被适配接口
        public void specificRequest()
        {
            Console.WriteLine("specificRequest()");
        }
    }

    class Adapter : Target
    {
        private Adaptee ad = new Adaptee();  // 关联到Adaptee
        public void request()
        {
            ad.specificRequest();
        }
    }

    public static void Main()
    {
        Target t = new Adapter();
        t.request();
    }

} 

结果:

specificRequest()

四、类适配器

4.1 UML类图

图片 3

类适配器和目的适配器的组合要素一样,唯一的区别是Adapter针对Adaptee,从涉嫌关系成为了继续关系,并把Target写成了接口(因为C#中类只好单继承)。

4.2 代码实现

C++

#include <iostream>
using namespace std; 

// 抽象类
class Target
{
public: 
    virtual ~Target() {};
    // 目标方法
    virtual void request() = 0; 
};
class Adaptee
{
public:
    // 被适配的方法
    void specificRequest()
    {
        cout << "specificRequest()" << endl;
    }
};
class Adapter : public Target, public Adaptee // C++实现中只在Adapter类和对象适配器有区别
{
public:
    Adapter()
    {
    }
    // 目标方法
    void request()
    {
        // 调用被适配的方法
        specificRequest();
    }
};

int main()
{
    Target& t = Adapter();
    t.request();
}

C#

using System;
using System.Collections.Generic;
class Program
{
    interface Target
    {
        // 目标接口
        void request(); 
    }

    class Adaptee
    {
        // 被适配接口
        public void specificRequest()
        {
            Console.WriteLine("specificRequest()");
        }
    }

    class Adapter : Adaptee, Target
    {
        public void request()
        {
            specificRequest();
        }
    }

    public static void Main()
    {
        Target t = new Adapter();
        t.request();
    }
}

五、对象适配器和类适配器的相比较

类适配器:

  •  用一个现实的艾达(Ada)pter类对艾达ptee和Target举办匹配,结果是当大家想要匹配一个类以及具有他的子类的时候,类Adapter将不可能胜任。
  •  使得Adapter可以重定义艾达ptee的一对行为,因为艾达pter是Adaptee的一个子类。
  •  仅仅引用了一个对象,并不需要额外的指针以直接拿到Adapteee。
  •  类适配器采取“多延续”的落实形式,带来了蹩脚的高耦合,所以一般不引进应用。

目标适配器:

  •  允许一个Adapter与多少个艾达(Ada)ptee(艾达ptee本身和他的持有子类)同时工作,Adaptee也足以三回给拥有的Adaptee添加功用。
  •  使得重定义Adaptee的作为相比艰辛。这就需要生成艾达ptee的子类并且使得艾达pter引用那个子类而不是引用Adaptee本身

六、优缺点

6.1 优点

     
 无论是对象适配器形式仍旧类适配器格局都富有如下优点:

      
(1) 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。

       (2) **充实了类的透明性和复用性**,将切实的作业实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在五个例外的序列中复用。

      
(3) 圆滑和扩充性都分外好,通过采用安排文件,可以很便利地更换适配器,也可以在不改动原有代码的基本功上加码新的适配器类,完全符合“开闭原则”。

     
具体来说,类适配器形式还有如下优点:

     
由于适配器类是适配者类的子类,由此能够在适配器类中置换一些适配者的措施,使得适配器的油滑更强。

      对象适配器情势还有如下优点:

     
(1) 一个对象适配器可以把两个不同的适配者适配到同一个对象

      (2) 可以适配一个适配者的子类,由于适配器和适配者之间是涉嫌关系,按照“里氏代换原则”,适配者的子类也可经过该适配器举办适配。

6.2 缺点

     类适配器格局的败笔如下:

     
(1) 对于Java、C#等不辅助多重类继承的语言,一次最四只好适配一个适配者类,不可以而且适配两个适配者

      (2) 适配者类不可以为最后类,如在Java中不可能为final类,C#中不能够为sealed类;

      (3) 在Java、C#等语言中,类适配器形式中的目标抽象类只好为接口,无法为类,其采取有一定的局限性。

      对象适配器形式的缺点如下:

      与类适配器形式相比,要在适配器中置换适配者类的某些方法相比劳碌。假设一定要置换掉适配者类的一个或六个艺术,可以先做一个适配者类的子类,将适配者类的点子置换掉,然后再把适配者类的子类当做真的的适配者进行适配,实现过程相比较复杂。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图