初见设计模式是在学习安卓的过程中发现了,在我用到许多名中含有factory和buil相关的类的时候产生了一些疑问,后来才发现这些是设计模式的一种。所以带着疑惑和好奇开始了设计模式的研读之旅。本系列文章就是记录在我研究设计模式中的所思所想。主要的材料来源于《设计模式》、《大话设计模式》和w3c菜鸟在线教程网站,说是自写的文集,倒不如说是读书笔记更实在些许。
0x001 概述
《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)是软件工程领域有关软件设计的一本书,提出和总结了对于一些常见软件设计问题的标准解决方案,称为软件设计模式。该书作者为:埃里希·伽玛(Erich Gamma), Richard Helm, Ralph Johnson,John Vlissides,后以“四人帮”(Gang of Four,GoF)[1]
著称。---维基百科
统一建模语言(UML,英语:Unified Modeling Language)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。---维基百科
0x002 UML介绍
UML是一门建模语言,甚至是一门专门的学科,这里不探究如何使用UML(或许未来会专门开一片文集来学习UML),只是为了看懂UML类图而介绍相关的东西。
为了介绍UML,我画了一张类图(模仿自大话设计模式):
-
矩形框:表示Class,比如图中的Animal,就是表示一个类,一共分为三层:
- 类名称:如果是抽象类,就用斜体表示,如果是接口就在前面写上<<interface>>,接口的另一种表示方法是棒棒糖表示法,如图中的SpeakEnglish
- 类属性
- 类方法
注意:前面的+ 代表public,-代表private,#代表protected。
-
空心三角实线箭头:表示Generalization,继承,例如图中的Animal和Bird。
class Animal{ public boolean life; public void metabolism(O2 o2, Water water){} public void multiplication(){} } class Bird extends Animal{ public boolean feather; public void layEggs(){ } } class O2 { } class Water { }
实线箭头:表示directed Association,关联,例如图中的Penguin和Climate,企鹅的生存和气候关系很大。
class Penguin extends Bird{
private Climate climate;
}
class Climate {}空心方形实线箭头:表示Aggregation,聚合,例如图中的Goose和Geese,多只大雁聚合成一个雁群。
class Geese{
private List<Goose> gooseList;
public void vFly(){ }
public void straightFly(){ }
}
class Goose {
public void layEggs(){ }
public void fly(){ }
}实心方形实线箭头:表示Composition,组合,例如图中的Bird和Wing,Wing是Bird的一部分。
class Bird extends Animal{
private Wing wing;
public Bird(Wing wing){
this.wing=wing;
}
public boolean feather;
public void layEggs(){ }
}
class Wing {}虚线箭头:表示Dependency,依赖,比如图中的Animal和02和Water,动物生存依赖水和氧气。
class Animal{
public boolean life;
public void metabolism(O2 o2, Water water){}
public void multiplication(){}
}
class O2 { }
class Water {}-
整理之后
/** * 动物类 */ class Animal{ public boolean life; //动物的新陈代谢需要水和氧气 public void metabolism(O2 o2, Water water){} public void multiplication(){} } /** * 鸟类:继承动物类 */ class Bird extends Animal{ //翅膀是鸟类组成的一部分(这里只列出翅膀而已) private Wing wing; public Bird(Wing wing){ this.wing=wing; } public boolean feather; public void layEggs(){ } } /** * 翅膀类 */ class Wing {} //企鹅继承鸟类 class Penguin extends Bird{ //企鹅的生存和天气关系很大 private Climate climate; public Penguin(Wing wing) { super(wing); } } /** * 氧气类 */ class O2 {} /** * 水类 */ class Water { } /** * 气候类 */ class Climate { } /** * 雁群类 */ class Geese{ private List<Goose> gooseList; public void vFly(){} public void straightFly(){ } } /** * 大雁类 */ class Goose { public void layEggs(){} public void fly(){ } }
0x003 设计模式六大原则
这些暂且列在这,因为现在对于这些并不能真正理解所以我决定从实例出发,先理解再解释。
1.开闭原则(Open Close Principle)
2.里氏代换原则(Liskov Substitution Principle)
3.依赖倒转原则(Dependence Inversion Principle)
4.接口隔离原则(Interface Segregation Principle)
5.迪米特法则,又称最少知道原则(Demeter Principle)
6.合成复用原则(Composite Reuse Principle)
0x004 设计模式类型
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
MVC 模式(MVC Pattern)
业务代表模式(Business Delegate Pattern)
组合实体模式(Composite Entity Pattern)
数据访问对象模式(Data Access Object Pattern)
前端控制器模式(Front Controller Pattern)
拦截过滤器模式(Intercepting Filter Pattern)
服务定位器模式(Service Locator Pattern)
传输对象模式(Transfer Object Pattern)