23种设计模式以及设计原则(二)

来源:互联网 发布:黑暗之魂2网络延迟 编辑:程序博客网 时间:2024/05/06 23:07

1.门面模式


    门面模式说白了就是封装了一个类,而此类的作用是按顺序执行方法。调用者无需知道具体流程,只需要将要传递的参数传给该类,这样该类就按顺序执行就好了,符合高扩展性以及高内聚低耦合的原则。


    例如写信,顺序是先写内容、写信封、把信放到信封里、最后邮递出去,而且顺序不能颠倒(如果你非要较真说我先写信封后写内容,那万一要是之前给前女友写的信封被现女友看到了呢?哎,不说了,想想膝盖就疼)。如果正常实现的话我需要知道这个顺序,按顺序依次调用。而实现了门面模式就很好的进行了封装,我只需要传递给门面类我要写的内容以及地址就好。而且一旦警察叔叔要进行检查,我也不需要每次调用的时候都增加调用检查的方法,只需要在封装的类进行调用就好,当然我也不关心(检查就检呗,反正都是你爱我、我爱你之类的)。


2.适配器模式


    适配器这个词一定很熟悉吧,就是电脑连接电源的“黑匣子”(一想到黑匣子,最近的马航,哎不多说了,愿逝者安息),无论你是在天朝还是在岛国,适配器都会把不同电压转成你想要的36V。在介绍这个设计模式之前都需要说明一下,此设计模式并非设计程序时需要考虑的,而是一种补救措施,什么时候需要补救呢?那么我就接下来说明一下吧。

    每个管理系统中一般存在用户的这一个实体类(bean)。一开始的时候,我们应用的系统中实体类是这样的:

public class PersonBean {// 名字:张三李四王二麻子private String name;// 性别:用101表示女,111表示男(我倒觉得用010表示男更形象,而且正好互补嘛,都懂得,不要喷我,哎,有本事你别...)private String sex;// phone:iphone/Xiaomi(话说最近小米要改红米note的营销方式,被其他公司各种鄙视) private String phone;// set,get方法省略...}

    突然有一天,我这个系统要和另一个系统融合一下,结果另一家公司的实体是这样的:

public class AnotherBean {// 人家非用map存储基本信息private Map baseInfo;// set,get方法省略...}

    别说他们的设计好不好,反正人家就这么实现的,那怎么办?首先系统之间的传输使用 RMI(Remote Method Invocation,远程对象调用)的方式,(具体怎么回事问百大爷噢),然后那就想办法把两个实体进行糅合吧。好,我们的主角登场,就是使用适配器模式,我们定义一个AnotherBean的接口,然后定义一个适配器的类AdapterBean,继承咱们原来的Person类,然后实现这个接口,(当然,你要把所有的AnotherBean的实现你都得在写一遍,谁让java不支持多继承呢?不过看jdk8貌似支持接口中存在实现好的方法了,我看了一下,搞得java一点都不像java了,感觉有点c的方式了,既存在 -> ,又存在 :: ,不好意思,跑题了)。现在对原来系统中实现Bean的方式进行一下比较。

    原来:PersonBean person = new PersonBean();  使用适配器设计模式后:PersonBean person = new AdapterBean();

    这样在原系统中,除此之外什么都不需要修改,是不是很方便呢?

3.模板方法模式


    模板模式,听上去很神奇,其实大家一直都在用,而且没什么难度。比如我们定义一个abstract父类,(如果你不知道abstract是神马东东,那你可以去面壁思过了),然后定义一些共通的方法,针对不同的子类进行不同的实现,调用之后就会出现完全不同的结果。

    对于这个模式我不想多说,但是我突然想到一个问题:如果面试问你,private的方法在其他类可以调用吗?最好的回答不是不能就结束了,而是不能,但是反射可以,而且强烈不建议调用,除非你做的是框架。

4.建造者模式


    建造者模式和工厂模式非常相似,记住一点你就可以游刃有余的使用了:建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了;而工厂方法则重点是创建,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。

    建造者模式使用的场景,一是产品类非常的复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适,我曾在一个银行交易类项目中遇到了这个问题,一个产品的定价计算模型有 N 多种,每个模型有固定的计算步骤,计算非常复杂,项目中就使用了建造者模式;二是“ 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到”,这个是我没有遇到过的,创建过程中不易得到?那为什么在设计阶段不修正这个问题,创建的时候都不易得到耶! 



    总结自《您的设计模式》,下载地址:http://download.csdn.net/detail/u012841509/7110901,上传人都是我,是不是很邪恶呢?骗点分好让自己能下载别人的东西嘛!方便你的同时也方便方便我,嘿嘿~

1 0