head first 设计模式
最近一段时间一直在看head first 设计模式,感触颇深,遂把其中之心得记录之,以便遗忘时重新熟悉。
6种设计原则
1.分离不变与可变:将可变元素提出,作为单独的模块,通过组合调用,不变的模块作为类。
2.多用组合,少用继承
3.面向接口编程,不要面向实现编程
4.为了交互对象之间的耦合设计而努力
设计模式
分为创建性模式、指责型模式、行为型模式(本人所写设计模式完全根据书籍顺序)
1.策略模式(行为型模式):
类图(总图)题目描述:为每种鸭子设置动作,fly、swim、quick、display四个方法。我们首先想到的编程方法为两个鸭子(红头鸭、绿头鸭)继承自Duck抽象类,如下:
类结构图需求改变了,要使红头鸭会飞,绿不会飞,想到可以覆盖duck中的fly方法,一个会飞,一个什么都不做。
现在需求又变了,来了一百只鸭子,五十只会飞,其他不会飞。怎么办? 每个都覆盖?
现在需求又变了,鸭子会了新的动作,会跳舞(dancing),怎么办?duck加,所有子类覆盖?
显然是不现实的,软件的复用(关闭修改、打开扩展)显得尤为重要。
既然鸭子的动作会变(不同的叫声、不同的飞行方式、不同的跳舞方式),而有些不会变(swim与display),由此我们可以分离不变与可变。将fly,quick提取,同时子类功能实现父类接口(面向接口编程),由此我们可以通过多用组合,少用继承(duck与fly、quick用组合)增加程序的伸缩性,并通过在抽象类中定义引用,然后通过set方法注入来完成组合。
最后:注意一点,尽量不要在结构中出现new,用构造方法传参或者set注入在client中生成对象后注入,这样可以增加程序的灵活性,同时可以动态修改。
对比 两者的动态性完全不同2. 观察者模式
类图(总图)观察者模式实质上就是在主题中加入list,将观察者封装。(加入get的作用是观察者可自行取舍)。同时也可以看出:动态加入的只是接口引用,而非具体实现,所以改变一方,另一方不会受影响(为了交互对象之间的耦合设计而努力)
3. 装饰者模式