【大话设计】初涉之装饰、代理、工厂模式

来源:互联网 发布:网络举报网站 编辑:程序博客网 时间:2024/05/16 03:26

1、装饰模式

         在装饰模式中,大鸟通过让小菜设计给一个人穿不同的衣服来讲解了装饰模式的概念。。。。虽然开始的时候小菜已经将不同的服饰类封装起来,在我们给人穿衣服的时候,我们直接调用某几个衣服类,比如说,我们会让一个人穿上西装、西裤、领结、皮鞋。。。那么我们可以直接调用西装类、西裤类、领结类、皮鞋类。。然后让那些类一个一个显示出来。。。。但是这样做的缺点就是在衣服类中还有装饰的功能,这样会使服饰类显得非常复杂,当我们选用什么样的衣服的时候还要想着怎样给他穿上。。。。而这时,装饰模式就出现了。他的示意图如下。


     这时,装饰模式为它提供了一项方便,那就是我们可以直接将我们需要的形象装扮所需要的衣服先组合在一起,比如直接将它们放在decorator这个接口这里。到时候我们直接调用这个组合。。。就好比,,当我们要删除手机中某一些的短信的时候,我们其实没有必要去一个一个选中,然后点删除,而是应该先一组组的选中某些我们想要删除的,最后直接点击删除就可以全部删掉。。。这里的不同的短信就是不同的类,删除就是我们调用的过程。。。装饰模式只不过是提供了一个可以供批量删除的一个平台。。。。(可能这个例子没有全部的将装饰模式的概念体现出来)。。总之,装饰模式的好处就是,它将类中的装饰功能从类中搬移去除,可以简化原有的类,这样有效的把类的核心职责和装饰功能更区分开了。而且可以去除相关类中重复的装饰逻辑。。。

             另外,书中装饰模式是这样解释的,是为已有功能冬天的添加更多功能的一种方式。。。。当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为。。比如用西装或嘻哈服来装饰小菜,但这种做法的问题在于,他们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。。。而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此当需要执行特殊行为事,客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象了。。。

 

 

2.代理模式

           从这个名称中我们也可以看得出这事代替别人去做一件事的意思。。。书中的概念“代理模式,为其他对象提供一种代理,以控制对这个对象的访问。。。”其实就是让另一个人去代替一个人做一件事,那么怎么实现呢。我们拿书中的例子来说,就是,当桌贾谊不能直接送女生礼物的时候,需要一个代理去帮忙。。。那么代理就出现了。如果没有代理,那么结构图是这样


     当有了代理的时候,结构图是这样?

 


     这样做那就没有追求者的事儿了,那应该怎么做呢。。。。其实不管是代理还是追求者,他们都有共同的方法,那就是送礼物,所以他们都实现了同样的接口。。所以,结构图应该是这样的。。。


         代理模式的应用:

                      1、远程代理。“也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在与不同地址空间的事实”。。。听起来比较难懂,所以我自己的理解可能有点不全面。在我看来,就像是抗日战争时,中国共产党分布在各个地区的一些地下党组织,在任何需要的时刻,他们都会代表中国共产党去做一些应该做的事情。而最大的领袖却不会让所有人知道在哪。。。。很牵强吧。。

                      2、虚拟代理:“根据需要创建开销很大的对象,通过他来存放实例化需要很长时间的真是对象。。”比如说我们打开一个很大的网页时,其中有很多文字和图片,但是我们还是会很快的打开那个网页,然而当我们打开网页的时候,很快出现在我们眼前的是那些文字,而图片却没有那么快能够下载下来,所以展现在我们眼前的就是一张张未打开的图片框,这就是通过虚拟代理来替代了真实的图片,此时代理存放了真实图片的路径和尺寸。。。。

                     3、安全代理:“用来控制真是对象访问时的权限,”一般用于对象应该有不同的访问权限的时候,比如说我们在qq空间中存放的我们不想让某些人看到的照片,那么它展示在别人眼中的就是另外一张图片。。。

                     4、智能指引:“是指当调用真实的对象时,代理处理另外一些事,”如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它,或当第一次引用一个持久对象时,将它装入内存,或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它,它们都是通过代理在访问一个对象时附加一些内务处理。。。

 

 

3、工厂方法模式

           首先,我们拿计算器的例子来说。。。。简单工厂的结构图是这样的。。


       将各种算法封装成各种类,在简单工厂中判断,到底要用那种类,然后直接调用类就可以。。。但是,有一个问题就是,当我们要增加运算方法的时候,我们要给运算工厂类的方法里加“case”分支条件的。。。这样做就相当于更改了原有的简单工厂类,,更改原有的类,那么就违背了我们之前说过的“开放—封闭原则”。怎样不用去更改原有的类,可以直接添加功能呢,下面我们的工厂方法模式就出现了。。。首先介绍他的模式图。


 

 

      我们根据依赖倒转原则,将工厂类抽象出一个接口,这样接口就只有一个办法,然后所有的要生产具体类的工厂,就去实现这个接口,这样一个简单工厂模式的工厂类,就变成了一个工厂抽象接口和多个具体生成对象的工厂,所以,当我们要增加一个运算方法的时候,就不需要更改原有的工厂类了,只需要增加此功能的运算类,和相应的工厂类就可以了。。这样整个工厂和产品体系就都没有修改的变化,而只是扩展的变化,这就完全符合了开放封闭原则。工厂方法克服了简单工厂违背开放—封闭原则的缺点,又保持了封装对象创建过程的优点,他们都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品的对象耦合,工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式波爱吃了简单工厂模式的优点,而且克服了它的缺点,但缺点是,每加一个产品,就要加一个产品的工厂类,增加了额外的开发量。。。

0 0
原创粉丝点击