设计模式

13 篇文章 0 订阅
11 篇文章 0 订阅

        在程序设计中,经常会遇到一个很让人痛苦的问题,那就是如何加快掌握各种类的方法,其实掌握这种方法的关键就在于掌握设计模式,掌握了设计模式就知道源代码的设计原理,这样就可以结合类中的各种方法,进行彻底掌握,更重要的是自己在设计自己的类时,设计模式起着指导设计思想的作用。

        理解设计模式不能从书本上的内容进行讲解,这样就是纸上谈兵。更重要的是自己的理解,自己在设计程序时结合设计模式与所接触的类进行的理解。因此只讲自己的东西,而不照搬别人的。


        设计模式分为三种,创建型,结构型,行为型。


        工厂方法模式以及抽象工厂模式,创建型,这两个设计模式是最常用也是最基础的设计模式,这两个设计模式的关键点就在于抽象方法上,工厂方法模式是只含有一个抽象方法的并且这个方法是用于创建子类的设计模式。工厂模式则是全部的方法都是抽象的,即接口,不同的接口实现创建出不同的工厂,工厂的创建对象方法可以创建出不同的对象。

作用上就是为了创建对象,实质上就是抽象方法的不同应用方式而已。

        适配器模式,结构型,有两种模式,分别是使用继承方式的类的adapter方式和以聚合方式实现的对象的adapter方式。适配器就是对接口进行空实现的类。将子类对象赋值给父类引用如:aclass ss=new  bclass();(aclass为父类,bclass为子类)涉及到多态性,ss在这里只能调用自己的以及被子类修改过的自己的方法,子类的扩展方法父类调用不了。而适配器模式的关键就在于适配,将原本不匹配的变为匹配。关键点就在于以下两点:1、ainterface ab=new binterface();2、binterface的实例化方式。对于第一点,由多态性可知,原类型不变,利用子类binterface的修改可实现ainterface接口的转变,即有一个接口变为另一个接口。对于第二点,binterface的实例化方式除了需要实现接口ainterface之外,设拥有子类binterafce所想要的特性的父类为sep,则1、可以通过继承将sep的方法加载进去(使用继承方式的类的adapter方式)2、不继承父类sep,而选择在类内部实例化一个sep,操作sep方法(以聚合方式实现的对象的adapter方式)。总的来说,其实就是一个被加上了特性的接口。这样父接口的其它接口就可以和这个接口协和工作了。

        其实对于适配器模式,核心就是类再生的两种方式,1、组合2、继承。分为被适配者和目标的话,则被适配者即是组合里实现的类。目标是一定要继承的那个类或接口。

        装饰器模式,结构型,它的特点在于可以在不创建新对象的情况下,使某个对象拥有所想要的功能。只需要将对象作为参数作为参数传给某个有我们所需要的功能的类即可,常见的操作就是InputStream对象传给DataInputStream以生成新的对象,这样原先的InputStream对象就拥有DataInputStream对象的功能了,当实现重叠包装InputStream对象时,可装在多种功能。


        组合模式,结构型,将将对象整理成树状结构。

         策略模式是设计模式属于行为型设计模式,该模式的关键点在于动态改变对象的行为模式,简单点说就是某个类通过调用某一接口的具体实现类的方法来定义自身的行为模式,所以当接口的具体实现类的方法改变时就可以改变行为模式而自身并不受其他影响。可以简单的记为所调用的方法的改变。

        观察者模式关键在于两个类java.util.Observable以及java.util.Observer。前者是被观察者,后者是观察者。该设计模式最关键的地方就在于自动更新,当被观察者发生变化后,就会通知观察者。调用是程序自动完成的,当继承Observable的实例发生改变之后,应用程序(该程序调用Observable的notifyObservers方法)会通过Observer的update方法,通知观察者实例发生改变。关键点在于自动通知改变。最明显的作用就在于父类是被观察者,子类是观察者,这样父类就可以将自身的改变更新到子类了,是很有必要的设计模式。


        建造者模式,这是我在程序设计中遇到的最有用的设计模式,在程序设计时经常遇到,例如处理器DefaultHandler与解析器SurfaceHolder就是这种设计模式,解析器本身是一个定义了一定的功能的接口,我需要对其进行一定的实现(即接口实例化)以完成实际上我们所需要的功能,但是解析器本身虽然拥有功能但是却需要处理器进行指导(处理器本身是一个具体的类)。简单点说就是处理器是人,解析器是工具,最后完成之后,在解析器那里得到所要的结果。其实对于创建者模式,最大的好处就是可以将处理与实际处理的细节进行分离,使得程序更加简洁,易于构造。

        原型模式,这是一个比较简单的设计模式实现比较简单,就是实现Cloneable接口并实现clone()方法,就可以实现对象的复制,而且比起new一个来说性能好很多,因为原型模式采用的是直接在内存里面复制二进制流,这样就会快很多,可以改善系统的性能,特别是在需要大量实现实现对象时。但是注意,复制时,对于基本数据类型被复制,但是引用,容器等数据类型确是不会被复制的,但是对于有继承Cloneable的接口是可以实现继承的,因此能将数组对象,引用对象,容器对象另行复制的是深拷贝,反之是浅拷贝。但对于大多数的容器类本身就有继承Cloneable接口,因此可实现深拷贝。

        迭代器模式,迭代器模式可说较之其他的设计模式更为常见,因为只要是容器基本就会有迭代器Iterator,迭代器模式提供了遍历容器所有数据的功能,但却又由于几乎所有的容器如Colection,list,set,都有封装迭代器,所以事实上很少需要自行封装迭代器(只要是集合或者说容器,就基本上会有迭代器,可说是同生共死)。迭代器模式的关键点在于迭代器提供了一个访问容器对象所有元素功能,但是又不暴露容器对象本身的细节。简单点说就是容器提供了一个访问自身所包含元素的功能集合类。

        模板模式,模板模式关键点就在于模板,其实这个模板指的就是模式的顶级逻辑,而这个逻辑在模式中不允许被修改,一般这个顶级逻辑存在于一个具体的方法中,该方法一般就包含了模式的类的方法,这些方法组成顶级逻辑,称为模板方法,步骤称为基本方法。模式的类是抽象类,该抽象类的方法包含一个或者多个抽象方法,这些方法留给子类实现(其实非抽象的也是可以修改的)。将部分逻辑以方法或者构造函数实现,剩余的逻辑由抽象方法代表,由于是抽象的,迫使子类实现剩余的逻辑,从而不同的子类对于相同的逻辑有不同的实现。

        命令模式,该模式将行为请求者与行为实现者解耦,就是说将请求者的各种行为进行封装,得到行为实现者的各个参数,实现者的方法就是调用的参数的方法进行封装实现的。也就是说,实现者的参数是请求者的行为过程封装类,实现者本身的方法就是调用不同行为封装类进行实现的。说白了就是将对象实现方法具体化,再封装具体化的方法,实现对象方法化。关键点其实就是就是要操作的对象作为参数,然后操作调用该对象的具体实例即可,一般会有三个对象,分别是被操作对象,命令封装类,调用类,前者为后者的参数。封装命令以调用。

        状态模式,状态模式与策略模式很像,应该说在结构上是一样的,但是,在实际使用时并不一样,策略模式通过改变拥有其行为的对象进行改变行为,即其对象是可以替换的;而状态模式则不会改变拥有其行为的对象,而是选择通过自身的方法传入参数以改变自己的状态(该方法实际上封装的是传入的对象的方法,而该对象就是拥有其行为的对象)。就是说,策略模式的对象是可替换的,平等的,而状态模式的对象则是平行的,不可替代的。关键的理解就是状态的体现就是方法,通过改变方法的参数改变行为,参数一般是数据。(策略的体现是参数对象)

        责任链模式,该模式比较简单,从他的名字就基本知道它的作用了,就是处理某件事的链式传递,话句话说就是,某件事你不处理的话,就传给别人处理。因此关键就在于创建一个接口或者抽象类,这个类应该有传入自身实例子类的方法,处理事件的方法,同时由于传入类,故而自身会有引用,同时也就意味着要设置一个得到该类的方法。掌握该设计模式的关键就在于理解对于事件处理的两种情况,一种是自行处理,另一种是传给别人处理。


链式调用,即某方法被调用时会接连调用其他的方法,这在实际的程序设计上具有很重要的作用,生意经常出现的程序设计技巧。链式调用有一个常用特例,就是回调,即对象调用某对象,某对象调用对象的方法实现对象操作自身。注意方法间的对等,从属关系,链式调用属于从属关系。


        中介模式,该模式是非常有用的模式,因为该模式可以化简调用,化简对象之间的关系。中介模式顾名思义就是存在中介的模式,而这个中介就是使得对象的关系由原来的一对多变为一对一(当出现各对象之间需要配合工作时,就会出现一对多的情况),就是说可以使得某对象就只需要与中介进行交互即可。程序设计时,由于需要交互,故而会出现彼此调用,这样就可以实现某对象就只是使用自己的方法就可以实现调用所要调用的对象。中介模式的关键点就在于交互的简化(实现一对一),而中介集合了所有复杂的关系。(实际上的一般做法是,将一些对象传给中介,中介存储起来,并封装好运行这些对象或其方法的方法供某一对象调用,而某一对象必须实现传入中介,这样才可以实现调用中介的方法以实现调用所要调用的对象),中介模式使用链式调用进行实际的程序设计。

        访问者模式,该模式实现的是将某类的数据结构与操作相分离(通常该类的数据结构存在容器里,像list,set)。通常该类的是以数据结构为主体,再给出一个操作数据结构元素的方法,这样使得该类变得极为简单,几乎就是数据结构,而将操作交给数据结构的元素处理。元素自身实现一个以访问者为参数的方法,这样就可以实现操作方法与数据结构的分离,且只需要改变访问者就可以操作方法的改变,因为实际上元素与访问者之间实现的是回调。关键在于数据结构的该类的方法传入访问者,而访问者在内部与元素进行交互。

        解释器模式,该模式较少使用到,因为解释器模式实际上就是语句的具体实现,即当我们将语句输入时,解释器就解释语句并进行相应的操作,如类调用,方法调用等。该模式顾名思义,就是实现解释器进行相应的翻译操作的模式。


        备忘录模式,该模式用于对某个类的状态进行存储,一般有三个类,originator,memento,caretaker,memento就是备忘录,它主要负责对某类的状态进行存储,可使用通常含有方法setxx()与getxx(),作为originator的参数进行状态存储,并在别处进行存储。originator是需要进行状态存储的类,所以通常拥有createMemento(),useMemento(memento),setState(),getState(),进行相关的状态以及备忘录的设置。caretaker则是负责对负责对于memento进行管理,也就是memento实际存储的地方,通常有方法setMemento(),getMemento(),但是不对memento进行操作,因为memento所保存的状态是他的拥有者originator的。备忘录模式的关键就在于备份状态,需要时用于恢复。

        外观模式,该模式是非常有用的设计模式,在实际编程中用到的地方很多,因此是很有价值的设计模式。外观模式并不难,它的设计思想就是为一系列子类组成的系统提供一个方便调用的接口,简单点说就是要实现一个操作可能会需要调用好几个类的方法才能实现,但是将这个过程封装为一个方法,这样调用起来就简单多了。关键在于使用一个类将子系统的各个调用过程进行封装,得到简便的一组方法。简单点说就是将某操作的调用过程封装为一个方法。

        代理模式,该模式顾名思义就是代替其他类进行被操作,也就是说,代理类必须实现被代理类的所有方法,被代理类一般作为代理类的参数,这样代理类才能间接操作。代理模式分为静态代理模式,动态代理模式,动态代理模式是为了解决当被代理对象不确定时的情况而出现的,格式一般就是 Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
  subject.request();
利用动态代理模式可以实现运行时动态改变被代理对象,需要改变的控制接口,需要改变的控制方式。(未完成)

        桥梁模式,桥模式较为少用,实际上桥模式说白了就是桥接的意思,就是将两个分离的功能模块连接起来。就像生产电视机,将电视与生产商分别抽象,然后就可以实例化出很多不同的子类,最后子类进行桥接即可。关键点就在于将抽象部分与实现部分相分离,使他们可以独自变化。

        享元模式,该模式的作用在于共享,就是说当有多个相同对象时,只需要实现一个就行了。享元模式较为简单,因为归根结底就是共享,但是享元模式却可以减少内存的消耗。但是应该明确,内存的消耗确实减少了,但是却要增加许多的操作建立共享的机制,这使得程序复杂化了。



(未完成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值