观察者模式
观察者模式完美的将观察者和被观察对象分开,系统中的每个类将重点放在某一个功能上,而不是其他的方面(对象之间的交互),很好的体现了单一职责原则。观察者将自己注册到被观察者的容器中,被观察者不应该过问观察者的具体类型,而是使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么这个观察者是相同的接口即可,基于接口而不是具体的实现,这一点为程序提供了更大的灵活性。
现实生活中像移动的就业信息推送系统,希望得到业务的人(观察者)先到移动注册,然后如果有具体的信息,移动会主动的推送到预订业务的人,不需要预订业务的人去主动询问。
装饰者模式
装饰者模式不在不改变原类文件的情况下动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。当我们需要为某个对象动态地增加一个功能的或职责的时候,可以考虑使用装饰者模式;当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应变化而增加爱继承子类扩展的方式,因为这种扩展可能会造成子类膨胀的速度过快,难以控制,此时可以使用装饰着模式。
对于这中模式的实现,会有被装饰的具体对象,被装饰的抽象,装饰者的抽象,和若干个装饰着,这若干个装饰者并不是创建各种不同的对象(所以装饰者模式为结构型模式而不是创建型模式),而是每个装饰者都会有一个真实的对象的引用,然后在这个具体对象方法的前后添加一些新的功能,起到装饰的作用。例如有两个装饰 1,和装饰 2,那么可以把装饰 1 当作装饰 2 的具体对象作为参数传进去,这个时候就会产生另外一种新的装饰了,而且没有新的子类。
现实生活着的例子例如包饺子,步骤分为和陷,和面,杆皮,包饺子,煮饺子,可以在和陷这个方法的前面多加点配菜,也可以在和面这个方法的前面在面里面加个鸡蛋,也可以同时用这两个装饰先加菜后和面加鸡蛋,这样就可以用两个已经存在的装饰产生一个新的装饰了。