设计模式の行为型の责任链模式
设计模式の行为型の观察者模式
大概说明
如果我希望一个动作在发生的时候,希望订阅他这个动作的所有人都知道了有这么一件事的话,那么就采用观察者模式。
没用观察者模式的情况下
1 | class Event |
这个事件的触发可以看到如果我不断的有新的人需要订阅的话,那么这个 trigger
方法不断的就是要添加新的逻辑和业务。违反了设计模式-开闭原则,就是对修改关闭,对扩展开放的原则。
设计模式の装饰器模式和观察者模式的区别
观察者模式
观察者模式完美的将观察者和被观察对象分开,系统中的每个类将重点放在某一个功能上,而不是其他的方面(对象之间的交互),很好的体现了单一职责原则。观察者将自己注册到被观察者的容器中,被观察者不应该过问观察者的具体类型,而是使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么这个观察者是相同的接口即可,基于接口而不是具体的实现,这一点为程序提供了更大的灵活性。
现实生活中像移动的就业信息推送系统,希望得到业务的人(观察者)先到移动注册,然后如果有具体的信息,移动会主动的推送到预订业务的人,不需要预订业务的人去主动询问。
装饰者模式
装饰者模式不在不改变原类文件的情况下动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。当我们需要为某个对象动态地增加一个功能的或职责的时候,可以考虑使用装饰者模式;当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应变化而增加爱继承子类扩展的方式,因为这种扩展可能会造成子类膨胀的速度过快,难以控制,此时可以使用装饰着模式。
对于这中模式的实现,会有被装饰的具体对象,被装饰的抽象,装饰者的抽象,和若干个装饰着,这若干个装饰者并不是创建各种不同的对象(所以装饰者模式为结构型模式而不是创建型模式),而是每个装饰者都会有一个真实的对象的引用,然后在这个具体对象方法的前后添加一些新的功能,起到装饰的作用。例如有两个装饰 1,和装饰 2,那么可以把装饰 1 当作装饰 2 的具体对象作为参数传进去,这个时候就会产生另外一种新的装饰了,而且没有新的子类。
现实生活着的例子例如包饺子,步骤分为和陷,和面,杆皮,包饺子,煮饺子,可以在和陷这个方法的前面多加点配菜,也可以在和面这个方法的前面在面里面加个鸡蛋,也可以同时用这两个装饰先加菜后和面加鸡蛋,这样就可以用两个已经存在的装饰产生一个新的装饰了。
设计模式の结构型の代理模式
大概意思
这个模式其实比较简单,就是你想访问一个类的时候,不直接访问,而是找这个类的一个代理。
代理就是中介,有中介就意味着解耦。
在代理模式下,代理对象和被代理的对象,有个重要特点:必须继承同一个接口。
这里说下重点,之前说过的 适配器模式,和代理模式非常非常像,只不过是在适配器模式下,适配器和它要适配的类没有继承同一接口,适配器就是要把这个第三方类变成符合接口规范。适配器也是个中介,所以我说它们很像。
实现
接口:
1 | interface Image |
现在我们有一个 Image 接口类,接口定义 getWidth 方法。现在我们需要一个具体类(实现类)来实现这个接口。
设计模式の结构型の链式模式
设计模式の结构型の门面模式
概念
用过 Laravel 的朋友的应该熟悉,Laravel 给我们科普了一个概念 Facade,然而 Laravel 中的 Facade 并不是真正设计模式中定义的 Facade,那么为什么它们都叫一个名字呢?
我们还是先来了解一下 Facade 这个单词的意思吧。
首先它的读音是[fəˈsɑːd],源自法语 façade,法语这个词原意就是 frontage,意思是建筑的正面,门面,由于以前法国,意大利的建筑只注重修葺临街的一面,十分精美,而背后却比较简陋,所以这个词引申的意思是表象,假象。
先讲设计模式中的概念
在设计模式中,其实 Facade 这个概念十分简单。
它主要讲的是设计一个接口来统领所有子系统的功能。看完下面这个例子就明白了:
设计模式の结构型の依赖注入模式
很简单的理解
终于要讲到这个著名的设计原则,其实它比其他设计模式都简单。
依赖注入的实质就是把一个类不可能更换的部分 和 可更换的部分 分离开来,通过注入的方式来使用,从而达到解耦的目的。
一个数据库连接类
1 | class Mysql |