复合模式其实就是混合使用了几种模式来解决一般性问题。这种解决方法一定成熟经过验证的。
其中大名鼎鼎的MVC模式就是一种复合模式,MVC是面试中经常问到的了,就算不是很了解的人也能说出一二来,虽然当时我对设计模式还不懂,但是就懂得胡扯些三层模型,展示层,模型层和控制层。
View视图:用来呈现数据,和用户进行交互,一般来说,视图是用来表示模型层的数据的。
controller控制器:用来取得用户的输入并解读其对模型的意思。
model模型:模型持有所有的数据,状态和程序逻辑。模型并没有注意视图和控制器,但是提供给了操纵和检索状态的借口,并将状态通知给观察者。
可以看出设计得非常巧妙而具有通用性。模型对数据进行操作和保存,可以说是比较独立的,视图让界面设计人员可以独立于后台逻辑。这样流程变得相当清晰,用户操作视图,比如点击了开始按钮,控制器对该事件进行解读,然后调用模型的开始方法,执行对应的业务,模型执行业务完成后,将状态结果告诉给需要知道的对象。这里,有可能是视图也有可能是控制器。那么如何让其解耦呢?这里就用到了观察者模式,需要获得状态结果的对象向模型注册,模型到时候通知对方就可以了。对于视图来说,控制器为视图提供了行为,那么如何让视图和控制器解耦呢?这里就用到了策略模式,对视图的行为都委托给控制器来执行,控制器将请求传递给模型。通过策略模式,视图可以很方便的配置自己的行为。很多时候,视图还使用了组合模式来对控件进行组装。
在开发web应用的时候,经常使用的model2是MVC在web方面的一些调整。javaee中的ssh框架就很好的体现了这点,当然和标准的MVC有一定的差别,那是因为web并不是实时的通知客户变化的,还出于一些不同,因此对模式做出了调整。