转业10年的IT之路

开篇

     
从我读高校时起初,我压根没悟出过我会进入这一行,而且一干就干了10年。

整日逛新浪,就是狠不下心来写篇博客,忙是一面,可是说忙能有多忙吗,都有时间逛乐乎,写篇博客的时光都不曾?(那还真不好说)

     
其实自己读大学时学的正经确实与IT行业有关,不过本人越发年代,互连网发展刚刚萌芽,这些专业的小圈子太新,也可能是本身读的这一个大学不是五星级名校。再加上老师都告知大家,大家学的那些专业,以后能从事本专业的人估量没多少个,越发挫败了大家从事那么些行当的自信心。回想起当时怎么选取那个正式的原因,纯粹是因为那门专业名字很潮——《经济与科学技术新闻保管》。

老是想到写一篇新的设计情势,我总会问自己:

     
不过当自己高校完成学业将来,发现高校时学的东西没什么太大用,因为也没怎么地方可以给大家施展的,大家学习的深浅和水准也不足以让大家施展。大约学了有些诸如《图书检索》、《情报学》、《艺术学》、《农学原理》、《心情学》(到明天本身也不太明了怎么要学那么些)、《总括机网络》、《音信文学》、《电子商务》这样的学科,那些时代学这个的人或者算是相比较潮的了呢,但是我们学的单纯是皮毛而已,很多在劳作上都是用不上的。

1,自己清楚了啊?

     
于是在预期之中的结束学业后找不到办事的状态爆发后,自己在TV上看出那时很火的IT培训广告,于是自己伏乞着爸妈,让他们帮自己交学习成本,上了一所IT培训高校,学习网络工程,也就是当时相比流行的CCNA\RHCE\MCSE的栽培。因为那类培训重点是以实操为主,而自我本人就是一个喜欢新鲜事物,更加是电脑、科学技术方面的,所以读书的比较认真,明白知识也正如快,所以在毕业的时候,也很不难的找到了一份公司网管的行事。即便那份工作开头交付我的报酬很低,做的事务也很基础,但本身要么万分感谢当时的主管娘可以给自身那样的空子,因为她帮自己打开了通向IT这几个圈子的征途的大门。

2,我能以一种简单且有逻辑的法门把它说出去啊?

第一年

     
当时的做事真正很粗略,只是做做公司公司本部的互联网维护、台式主机维护(说是集团本部,实际上唯有几十号人),几台简单的服务器管理,还有优异行政、技术部门干一些小事。做的业务都很不难,所以在呆了一年左右,由于自己年轻,不愿意就此荒度人生,于是就开头做跳槽的准备干活了。说到这,我得感谢当时在培育机构认识的指引员,她是我在IT那条路上可以走得更远一些的关键人物。

     
因为那一个引导员跳槽到了别的一家IT培训机构,而且大家还保持着联系,可能是分外时候大家以此班的人读书相比较认真,给先生们都预留了比较好的影像,再拉长我们班的帅哥比较多(哈哈哈,有些自夸了),所以才能让助教们甘于结交和珍贵呢。所以,我的时机也是如此挣来的,世间万般皆有因果,那话没错。就是在那位指点员老师的推荐之下,我幸运进入了她后来跳槽所在的栽培机构,成为了一名IT教授。尽管说得不惬意一点,我那算是走了方便之门,然而那一个后门真心走得值,我很庆幸当时以此机会把握住了,也尤其感谢那位引导员老师。

不说做到有的放矢,但是一本正经的放屁仍旧要有呢,起码要忽悠得有声有色嘛(手动斜眼笑)

第二年

     
接下去的那份教师工作,我开首了自我的上课生涯,一初步我们那种新人是不能教的,只好听这几个教的好的名师上课,然后渐渐试讲,如果资历老的教师以及教学主管认同了,你才能教。所以对自家的话,那的确是给时间让我get了一项新的技术,而且仍可以源源巩固自身事先所学的IT理论知识,而且如故拿工钱的,所以那份工作,让我变得开朗、热情起来,我开首学着跟学生们打交道,我起来和老师们聊着技术话题、也学会了和友好的老总娘打交道。也由此认识了一帮IT人员,至今还有联系,其中还有相比较逗的是,之前我以为很牛的名师,后来本身还给他牵线过工作。

     
那份工作是自我IT之路的转会点,帮自己提升了协调的职场LEVEL,也让我对社会、职场、以及人情世故有了更深厚的认识。

     
在自己干了两年的时候,由于培训行业的没落,再加上集团的CEO娘出现经济难点被有关机关请喝茶之后,我和一批同事被迫离开了这家培训机构(被裁掉,可是当下还赔了俺们三个月的薪俸,想起自己内人还对马上能获取那笔巨款感到很高兴…)。

有关工厂方式的多少个难题

第四年

     
那份工作实际是本身很不佳听的,因为我看不惯老总,也不太喜欢身边的一对同事,关键是及时应聘时招自我进企业的副总对我要么很欣赏的,我也正如乐意为她报效,所以才一向忍让。不过由于大业主的正宗对他倡议的政治斗争,他只可以离开店铺。我不满意这几个老董,不是其他,是她自家风气的难点,他的活着、行为有那多少个题材,不是一个很正式的人,而自我又有点愤世嫉俗,所以,合不来,不合则散呗,纵然我对她有理念,可是自己如故感谢他,给自己报酬,让自身进步自己的职场经验,而且在他的这家铺子里,我全权参与了店家的OA建设项目,也算自己对商厦新闻种类的入门吧。所以人生的每段经历都是宝贵的,不管它给您哪些的洗礼,岁月留下的痕迹只会让你越来越强硬。

1,这一个是拿来干什么的?

半路小结

     
看到后面的这一个经历,读者们自然会以为自身的这一个经验几乎很low,比起那么些在500强、BAT工作、然后改成领域专家、甚至有投机集团,成就自己人生的后生比,几乎low到爆。没错,我要好也这么认为,但自己的IT之路,确实是靠着自己的心怀、运气、再加一点点积累的实力,画虎不成反类犬的走到前天,把它写下来,或许对于那个985、常青藤的高材生们来说一无所能,然则那么些世界总是有部分平日的人必要用常常的故事来鼓励,那才是自我写下它的目标吗。

2,怎么用?

第六年

     
那份工作也是本身的IT人生转折点,我进入了人生当中首先家国有公司,也在那一个公司结识了几位贴心,而且像我那种矫情的人,可能比较符合在看起来洋气的信用社里面工作,也喜爱里面各类文明的人,包蕴国外人。在这家店铺本身伊始承担整个集团的IT管理,还有工厂、国外的小支行等地,我对IT的认知扩充到了新的小圈子,也明白了部分我以前都不大懂的新名词、翻墙、VPN、存储、前端、后台、集群等等。往日我就关系过,我的IT技能应该算是半路出家,跟那一个专业出身的人比持续,所以到这一年,我要好的IT知识系统才算真正形成,而且将它们付诸实践——用AD域管理整个集团的终极、网络行为需求审计、网络安全要求起首的时候打造并且要驾驭好企业的需要、主要的行使要运用应用服务器+存储的艺术,保障数据的安全性、互联网工程布线和机房建设的途径很多(不亲自参加进去,只看理论根本就弄不知晓,而且不难被人忽悠)、IT的审计工作很细心(需求提须要审计公司的音信很多)、IT那行葡萄牙语很首要(不会韩文的IT比会塞尔维亚共和国(Republic of Serbia)语的IT永远低一个水准)。

     
所以,我在这家公司,才算真正的入了IT那行的路线,我的IT知识连串才算真正建立,看来我实在算是一个天机很好的人。

3,不用行依旧不行?

第八年

     
写到那里大家会发现自家是个很不忠诚的人,跳了这么多槽,其实我想表达,我当然就是一个不安分的人,可是自己也有自家心里的执着,我恨不得能找到一家自己心头中的这几个公司。从前的这家国企尽管自己干的很心旷神怡,可他是价值观行业,并不是IT行业,而自我,一贯想去真正的IT行业去探视,于是,我又一遍采取距离了,临走前,还把后边培训机构的同事介绍了千古。

     
我毕竟进入了着实的IT行业,固然也是一家外企,不过一般是一家已经过气的加拿大上市集团,公司的人平均年龄领先45岁…据说他们和微软是一年的,他们径直靠着从前的一个大客户而活到现在。我在其中仍然从事IT工作,然而跟在此此前不均等,我打听到了越来越多的IT层面的系统知识:运维、SVN、GITHUB、Oracle、测试、开发、Java\.NET、项目管理等等。就算这么些集团后来的运行情势有点出人意表,我也莫名其妙的被并入另一家有985院校背景的集团,可是我在大型IT新闻系统工程、工业化领域音讯化、以及项目管理、工业网络、工业硬件方面都有了伸张视野的空子,在那些公司,我仍然做过购买工作、售前、售后工作,对自我而言,都是华贵的经历。就算自己还不是IT某个圈子的大方,然则凭着那些经历混口饭吃应该依然混得到的。

说个题外话,其实我离开这家公司多少有点个人心思在里边,类似于受到有失公平的看待、天天面对不喜欢的人、要好的同事相继离开,不过,我并不曾抱怨,因为集团或者给了自身工钱,公司并未亏欠我,我就不应当说这么些企业的坏话,我应该谢谢这一个公司予以我的全部。说那话的目的是因为自己看齐现在多如牛毛青少年都很不耐烦,离开公司随后数落以前公司各个不佳,或者在店堂的时候就怨天尤人集团的种种不公,总首席执行官的种种抠门,那样实在很不佳,因为人生都未曾想像的那么不难,一切都得靠自己,抱怨假诺有用,那这么些世界岂不每天充斥着负面的能量,所以还不如释怀一些,轻装上阵,让祥和变得更为强大才是我们应当做的事。

首先个和第七个难题,我前天就足以告知您答案:早点收工,可以

第十年

     
终于,百折不挠了10年,找到了内心中的这家商店,是一家网络集团,也不是神话中的BAT,然则是一家年轻的公司,我那几个岁数在里头都算老人。不过我就喜爱这样的小卖部,那样的气氛,开放、有生命力、有朝气,而且也是自个儿愿意工作的正业和世界,我有空子接触更加多前沿的IT知识,包含现在风行的东西:移动网络、VR、AI、罗布ot,也有一些出奇的辞藻在频频填充着自我的IT知识体系,自动化运维、产品经营、运营、DNU\DAU、APPU、PV等等那些最新的词(也许现在一度烂大街了)。但是自己幸运在自己还不算很老的时候能进来那样的营业所,在晋级自己境界的同时,也能博得愈来愈多的收入,我很满足。不过本人如故感到自我的IT生涯才刚刚初阶,学无止境,真的是,回顾前十年,时代的转变、科学和技术的上进,几乎令人跟不上趟。

     
用现在流行的一句话说,那有啥日子静好,只是有人为你负重前行,我期望自己可以为自我的家庭做尤其负重的人,所以在此继续鼓励自己,加油,努力,希望在人生的下一个街头,可以赶上更好的大团结。

富有的设计情势对我的话都是为着削减工作量。关于减弱工作量我的知晓是:每个必要,都应该在它优良的时候出现适当的代码!那一个太重大了

代码偷懒,前期返工多

过于设计,中期返工多

设计形式+经验得以化解那几个难题,其他的自身还不明白。没有经验如何做?八个宗旨:

1,能用

2,简洁

首先要达到能用,然后就是尽可能简单,那样代码就不会太差。首先你要团结看得懂,然后是让队友看得懂。

您驾驭您队友看到一堆烂的看都看不懂,也一句注释都不曾的代码的时候的思维阴影面积吗?

那实际也没怎么,何人没填过外人的坑呢?关键是她精晓你家在哪里,而且还明白您时常走夜路,就问你怕不怕?(卧槽,又跑题了。。)

 

须求:你有一个披萨店,只卖一种披萨,代码如下:

披萨:

import java.util.ArrayList;
import java.util.List;

/**
 * 披萨类
 * @author skysea
 */
public class Pizza {

    private String name;//披萨名称

    private String dough;//面团

    private String sauce;//酱料

    private List<String> toppings = new ArrayList<>();//佐料

    public Pizza() {
            this.name = "原味披萨";
            this.dough = "原味面团";
            this.sauce = "原味酱料";
    }

    void prepare() {
        System.out.println("开始准备披萨:" + name);

        System.out.println("开始处理面团:" + dough);

        System.out.println("添加酱料:" + sauce);

        System.out.println("添加佐料:");
        if(toppings.size() > 0) {
            for(String t : toppings) {
                System.out.println(" " + t);
            }
        }
    }

    void bake() {
        System.out.println("烘焙25分钟..");
    }

    void cut() {
        System.out.println("披萨切片..");
    }

    void box() {
        System.out.println("披萨打包..");
    }

    public String getName() {
        return name;
    }
}

 

披萨店:

/**
 * 只卖一种披萨的披萨店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza() {
        Pizza pizza = new Pizza();
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

 测试类:

/**
 * pizza测试类
 * @author skysea
 */
public class PizzaTest {
    public static void main(String[] args) {
        PizzaStore pizzaStore = new PizzaStore();
        Pizza pizza = pizzaStore.orderPizza();
        System.out.println("当前预定的披萨:" + pizza.getName());
    }
}

管理 1 

明天披萨店要拓展工作了,因为卖一种披萨顾客曾经吃腻了,现在要起始添加新的披萨类型

粗略工厂情势

Pizza类的改善

import java.util.ArrayList;
import java.util.List;

/**
 * 披萨抽象类
 * 1,修改private -> protected(保证子类拥有这些属性)
 * 2,将Pizza定义为abstract类,防止被new,也是为后面的改造做准备
 * @author skysea
 */
public abstract class Pizza {

    protected String name;//披萨名称

    protected String dough;//面团

    protected String sauce;//酱料

    protected List<String> toppings = new ArrayList<>();//佐料

    void prepare() {
        System.out.println("开始准备披萨:" + name);

        System.out.print("开始处理面团:" + dough);

        System.out.println("添加酱料:" + sauce);

        System.out.println("添加佐料:");
        for(String t : toppings) {
            System.out.println(" " + t);
        }
    }

    void bake() {
        System.out.println("烘焙25分钟..");
    }

    void cut() {
        System.out.println("披萨切片..");
    }

    void box() {
        System.out.println("披萨打包..");
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Pizza [name=" + name + ", dough=" + dough + ", sauce=" + sauce + ", toppings=" + toppings + "]";
    }
}

先交付新增的披萨

芝士披萨:

管理 2管理 3

/**
 * 芝士披萨
 * @author skysea
 */
public class CheesePizza extends Pizza{
    public CheesePizza() {
        this.name = "芝士披萨";
        this.dough = "芝士披萨的面团";
        this.sauce = "芝士披萨的酱料";
        this.toppings.add("很多芝士....");
    }
}

View Code

蛤蜊披萨:

管理 4管理 5

/**
 * 蛤蜊披萨
 * @author skysea
 */
public class ClamPizza extends Pizza {
    public ClamPizza() {
        this.name = "蛤蜊披萨";
        this.dough = "蛤蜊披萨的面团";
        this.sauce = "蛤蜊披萨的酱料";
        this.toppings.add("蛤蜊");
    }
}

View Code

意大利共和国烤肠披萨:

管理 6管理 7

/**
 * 意大利烤肠披萨
 * @author skysea
 */
public class PepperoniPizza extends Pizza{

    public PepperoniPizza() {
        this.name = "意大利烤肠披萨";
        this.dough = "意大利烤肠披萨的面团";
        this.sauce = "意大利烤肠披萨的酱料";
        this.toppings.add("一大波意大利烤肠...");
    }
}

View Code

 素食比萨:

管理 8管理 9

/**
 * 素食比萨
 * @author skysea
 */
public class VeggiePizza extends Pizza {
    public VeggiePizza() {
        name = "素食比萨";
        dough = "素食比萨的面团";
        sauce = "素食比萨的酱料";
        toppings.add("素食比萨");
        toppings.add("素食比萨佐料1");
        toppings.add("素食比萨佐料2");
    }
}

View Code

贴了那样多代码,先交由一波简单的兑现:

/**
 * pizza店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = null;
        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

}

在不考虑继续增添披萨序列的时候,那样的兑现有小难点,一般的话,达到了能够用的正经,然而不佳用,难点如下:

1,没有兼容原来的一种披萨方法 public Pizza
orderPizza(),相信自己,每一个public方法都是很首要的,因为您不领会有些许地方用到过。当然也不是不能知道,只是你知道也不肯定就能改,尽管你能改,也不必然改对。

2,String类型的type太不难失误了,个人感觉对先后开发不友善,当然那一个也要分情形,灵活和审慎本来就很难形成两全

3,推荐取不到适合的type时抛万分,而不是回到空,便于排查难点(此处的if里面只是一向new再次回到的对象,实际意况远比明天的繁杂)

付出第二版:

/**
 * pizza店
 * @author skysea
 */
public class PizzaStore {

    public Pizza orderPizza() {
        return orderPizza(PizzaTypeEnum.CHEESE);
    }

    public Pizza orderPizza(PizzaTypeEnum type) {
        Pizza pizza;

        pizza = SimplePizzaFactory.getPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}

SimplePizzaFactory:

/**
 * 简单工厂类
 * @author skysea
 */
public class SimplePizzaFactory {

    /**
     * 根据类型获取pizza
     * @param type
     * @return
     */
    public static final Pizza getPizza(PizzaTypeEnum type){
        switch (type) {
            case CHEESE: return new CheesePizza();
            case CLAM: return new ClamPizza();
            case PEPPERONI: return new PepperoniPizza();
            case VEGGIE: return new VeggiePizza();
            default: throw new NoSuchPizzaException(type.getCode());
        }
    }
}

辅助类(枚举,异常):

管理 10管理 11

/**
 * 定义pizza类型枚举
 * @author skysea
 *
 */
public enum PizzaTypeEnum{
    /**
     * 芝士披萨
     */
    CHEESE("cheese"),
    /**
     * 意大利烤肠披萨
     */
    PEPPERONI("pepperoni"),
    /**
     * 蛤蜊披萨
     */
    CLAM("clam"),
    /**
     * 素食比萨
     */
    VEGGIE("veggie");
    private final String code;
    PizzaTypeEnum(String code) {
        this.code = code;
    }
    public String getCode() {
        return code;
    }
}

View Code

管理 12管理 13

/**
 * 没有匹配的pizza异常
 * @author skysea
 */
public class NoSuchPizzaException extends RuntimeException{
    private static final long serialVersionUID = 6831396172306375611L;
    public NoSuchPizzaException(String message) {
        super(message);
    }
}

View Code

测试类:

/**
 * pizza测试类
 * @author skysea
 */
public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore store = new PizzaStore();

        Pizza pizza = store.orderPizza(PizzaTypeEnum.CHEESE);
        System.out.println(pizza);

        pizza = store.orderPizza(PizzaTypeEnum.VEGGIE);
        System.out.println(pizza);
    }
}

管理 14

好了,代码写到那里,其实对于:新增披萨类型的那一个要求的兑现其实已经很好了。至少来说现阶段的需要完成了,其次就是对调用方友好,至少队友不会跑过来问您类型传啥,不会告诉你他string字符串传错了,不会在您改个项目标时候,还要文告他(当然这几个也足以透过常量来拍卖)。

吹了半天,来说说这段代码的题材,正常情状下,须要会是那般变:

1,PepperoniPizza暂时不用了,一般的话,你问她要不要,他会说,这么些要看前面的营业情状(我:…)

2,你给自家新加一个xx披萨

现今亟需改的是八个地点,一个是工厂类,一个是枚举,不过主要的流水线是决不改了,借使您认为依然很辛劳在不考虑品质的意况下,你还是可以用反射来玩,改造一下厂子类(落成通过class来创立对象)和枚举(添加一个字段来存放type对应的class)就足以了,不赘述..

率先波需要就几乎可以如此收手了,随着工作的升高,披萨店那叫一个松动啊,纵然中间也对代码做了累累新的披萨,不过由于PizzaStore卓绝稳定,也没出什么大题材。

新的难点(开分店):

1,旗舰店在圣Paul,现在要在London开一家新的店

2,分店的披萨口味要基于当地的气味来展开调整,有限支撑可以不失品牌特色的同时,也能满意当地独特的气韵

3,分店披萨的类型与暂时与旗舰店保持一致

厂子方法情势

先把拥有的披萨列出来

管理,圣Paul的披萨:

管理 15管理 16

/**
 * 芝加哥芝士披萨
 * @author skysea
 */
public class ChicagoStyleCheesePizza extends Pizza {

    public ChicagoStyleCheesePizza() { 
        name = "芝加哥芝士披萨";
        dough = "芝加哥芝士披萨面团";
        sauce = "芝加哥芝士披萨酱料";

        toppings.add("芝加哥芝士披萨调料1");
        toppings.add("芝加哥芝士披萨调料2");
    }

    @Override
    void cut() {
        System.out.println("芝加哥芝士披萨版切片...");
    }
}
/**
 * 芝加哥蛤蜊披萨
 * @author skysea
 */
public class ChicagoStyleClamPizza extends Pizza {
    public ChicagoStyleClamPizza() {
        name = "芝加哥蛤蜊披萨";
        dough = "芝加哥蛤蜊披萨面团";
        sauce = "芝加哥蛤蜊披萨酱料";

        toppings.add("芝加哥蛤蜊披萨佐料1");
        toppings.add("芝加哥蛤蜊披萨佐料2");
    }

    @Override
    void cut() {
        System.out.println("芝加哥蛤蜊披萨版切片...");
    }
}
/**
 * 芝加哥意大利烤肠披萨
 * @author skysea
 */
public class ChicagoStylePepperoniPizza extends Pizza {
    public ChicagoStylePepperoniPizza() {
        name = "芝加哥意大利烤肠披萨";
        dough = "芝加哥意大利烤肠披萨面团";
        sauce = "芝加哥意大利烤肠披萨酱料";

        toppings.add("芝加哥意大利烤肠披萨调料1");
        toppings.add("芝加哥意大利烤肠披萨调料2");
        toppings.add("芝加哥意大利烤肠披萨调料3");
        toppings.add("芝加哥意大利烤肠披萨调料4");
    }

    @Override
    void cut() {
        System.out.println("芝加哥意大利烤肠披萨版切片...");
    }
}
/**
 * 芝加哥素食比萨
 * @author skysea
 */
public class ChicagoStyleVeggiePizza extends Pizza {
    public ChicagoStyleVeggiePizza() {
        name = "芝加哥素食比萨";
        dough = "芝加哥素食比萨的面团";
        sauce = "芝加哥素食比萨的酱料";

        toppings.add("芝加哥素食比萨调料1");
        toppings.add("芝加哥素食比萨调料2");
        toppings.add("芝加哥素食比萨调料3");
    }

    void cut() {
        System.out.println("芝加哥素食比萨版切片...");
    }
}

View Code

London的披萨:

管理 17管理 18

/**
 * 纽约芝士披萨
 * @author skysea
 */
public class NYStyleCheesePizza extends Pizza {

    public NYStyleCheesePizza() { 
        name = "纽约芝士披萨";
        dough = "纽约芝士披萨面团";
        sauce = "纽约芝士披萨酱料";

        toppings.add("纽约芝士披萨调料1");
        toppings.add("纽约芝士披萨调料2");
    }

    @Override
    void cut() {
        System.out.println("纽约芝士披萨版切片...");
    }
}
/**
 * 纽约蛤蜊披萨
 * @author skysea
 */
public class NYStyleClamPizza extends Pizza {
    public NYStyleClamPizza() {
        name = "纽约蛤蜊披萨";
        dough = "纽约蛤蜊披萨面团";
        sauce = "纽约蛤蜊披萨酱料";

        toppings.add("纽约蛤蜊披萨佐料1");
        toppings.add("纽约蛤蜊披萨佐料2");
    }

    @Override
    void cut() {
        System.out.println("纽约蛤蜊披萨版切片...");
    }
}
/**
 * 纽约意大利烤肠披萨
 * @author skysea
 */
public class NYStylePepperoniPizza extends Pizza {
    public NYStylePepperoniPizza() {
        name = "纽约意大利烤肠披萨";
        dough = "纽约意大利烤肠披萨面团";
        sauce = "纽约意大利烤肠披萨酱料";

        toppings.add("纽约意大利烤肠披萨调料1");
        toppings.add("纽约意大利烤肠披萨调料2");
        toppings.add("纽约意大利烤肠披萨调料3");
        toppings.add("纽约意大利烤肠披萨调料4");
    }

    @Override
    void cut() {
        System.out.println("纽约意大利烤肠披萨版切片...");
    }
}
/**
 * 纽约素食比萨
 * @author skysea
 */
public class NYStyleVeggiePizza extends Pizza {
    public NYStyleVeggiePizza() {
        name = "纽约素食比萨";
        dough = "纽约素食比萨的面团";
        sauce = "纽约素食比萨的酱料";

        toppings.add("纽约素食比萨调料1");
        toppings.add("纽约素食比萨调料2");
        toppings.add("纽约素食比萨调料3");
    }

    void cut() {
        System.out.println("纽约素食比萨版切片...");
    }
}

View Code

披萨倒是列完了,然而在其实的支付过程中,业务逻辑这么不难那是不能够的,想要改那怎么旗舰店披萨的类名是很辛劳的

一般要考虑:

1,是或不是单机,有没有其他外部系统在调用

2,改动原来的代码有怎样利益,更易于领悟吧?迭代了多少个本子之后垃圾代码太多了吧?

3,影响大不大

理所当然,我那边是随便造,你们吗,我就不清楚了,嘿嘿嘿,所以碰着那种场合,一般的话要悠着点,看日子,也要看影响,开发就是如此,同一个功能,2天有2天的做法,5天有5天的做法,10天有10天的做法

披萨店改造:

/**
 * 披萨店抽象类
 * @author skysea
 */
public abstract class PizzaStore {

    abstract Pizza createPizza(String item);

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        System.out.println("--- 制作 " + pizza.getName() + " ---");
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

/**
 * 芝加哥披萨店
 * @author skysea
 */
public class ChicagoPizzaStore extends PizzaStore {
    public static final String CHEESE = "cheese";
    public static final String VEGGIE = "veggie";
    public static final String CLAM = "clam";
    public static final String PEPPERONI = "pepperoni";
    Pizza createPizza(String item) {
        if (CHEESE.equals(item)) {
            return new ChicagoStyleCheesePizza();
        } else if (VEGGIE.equals(item)) {
            return new ChicagoStyleVeggiePizza();
        } else if (CLAM.equals(item)) {
            return new ChicagoStyleClamPizza();
        } else if (PEPPERONI.equals(item)) {
            return new ChicagoStylePepperoniPizza();
        } else {
            throw new NoSuchPizzaException(item);
        }
    }
}

London披萨店(和孟买披萨店大约一毛一样,那里就不进行了):

管理 19管理 20

/**
 * 纽约披萨店
 * @author skysea
 */
public class NYPizzaStore extends PizzaStore {

    public static final String CHEESE = "cheese";
    public static final String VEGGIE = "veggie";
    public static final String CLAM = "clam";
    public static final String PEPPERONI = "pepperoni";
    Pizza createPizza(String item) {
        if (CHEESE.equals(item)) {
            return new NYStyleCheesePizza();
        } else if (VEGGIE.equals(item)) {
            return new NYStyleVeggiePizza();
        } else if (CLAM.equals(item)) {
            return new NYStyleClamPizza();
        } else if (PEPPERONI.equals(item)) {
            return new NYStylePepperoniPizza();
        } else {
            throw new NoSuchPizzaException(item);
        }
    }
}

View Code

那段代码有多个难题要通晓驾驭:

1,这几个地方为什么要弄个抽象类出来?

这一个即将结合实际来领会了,分店与分店之间,需不须要统一规范化管理?需不需要有限援救自己的特征?答案自然,都是急需的

本条地点创建披萨的经过,毫无疑问是必然要一律的。就好像外卖一样,下单,炒菜,配送。整套流程都是这么,无法说你出来就从头炒菜了啊,这不科学。不均等的地点就是,你炒的哪些菜,好不可口。配送得快不快,稳不稳,服务好不佳。

之所以,抽象类的含义就是:规范、特色

2,factory咋个不见了?

因为把它和切实的store合并在一起了,那样又引申出此外一个题材:为什么要统一?因为store现在出任的角色就是facotry,刚才说过的创制进程已经停放父类中落成了,现在只须要在现实的store中去化解披萨的开创难点

3,为什么又不用枚举了,弄个String来成立pizza?

假设依然单机,用枚举当然会比直接扔个string来得稳当。

开了分集团,若是每个子公司都是一套完整的劳务在玩,丢个string,要比枚举来得好。原因有2:传输进程中的连串化和反种类化、越发灵敏(客户端不用每一次都因为那些缘故要去提高对应的包,尤其是多少个版本在跑得时候,升级了又会导致其余东西无法玩)

测试类:

/**
 * 披萨测试类
 * @author skysea
 */
public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();

        Pizza pizza = nyStore.orderPizza(NYPizzaStore.CHEESE);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.CHEESE);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.CLAM);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.CLAM);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.PEPPERONI);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.PEPPERONI);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");

        pizza = nyStore.orderPizza(NYPizzaStore.VEGGIE);
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");

        pizza = chicagoStore.orderPizza(ChicagoPizzaStore.VEGGIE);
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
    }
}

结果(结果太多了,就不全体截图出来了):

管理 21

 

 

Post Author: admin

发表评论

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