| 这个作业属于哪个课程 | 班级的链接 |
|---|---|
| 这个作业要求在哪里 | 作业要求的链接 |
| 这个作业的目标 | 学习设计原则,为开发打下基础 |
参考资料
书名 :软件设计模式
作者 :朱洪军
ISBN :9787115489760
出版社 :人民邮电出版社
出版时间 :2018年10月
学习总结
设计原则
单一职责原则
引起一个类变化的原因,只能有一个。即每个类只有一个职责。
开放/闭合原则
软件实体应该是可扩展,但不可修改的。当项目有新的需求变化时,可以对现有的代码进行扩展,以适应新的需求变化;但是,类的设计一旦完成,它就可以独立完成其工作,不可以对类进行修改。
接口隔离原则
客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。要避免接口污染,所谓接口污染就是对接口添加不必要的职责。
依赖倒置原则
上层模块不应该依赖底层模块,它们都应该依赖于抽象。抽象不要依赖具体,具体依赖于抽象。
Liskov替换原则
子类可以扩展父类的功能,但不能改变父类原有的功能。
设计模式
分类
部分设计模式详解
-
单例模式
- 定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
- 特点:
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点。
- 优点:
- 单例模式可以保证内存里只有一个实例,减少了内存的开销。
- 可以避免对资源的多重占用。
- 单例模式设置全局访问点,可以优化和共享资源的访问。
- 实现:
- 提供一个私有的静态实例,外界通过调用该公有函数来创建或获取该静态实例。
- 提供一个私有的静态实例,外界通过调用该公有函数来创建或获取该静态实例。
-
工厂模式
- 定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
- 优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了;
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
- 屏蔽产品的具体实现,调用者只关心产品的接口;
- 将创建对象的工作转移到工厂类,有利于解耦。
- 实现:
- 准备抽象产品、具体产品、工厂类,外部要获取产品对象,需通过工厂类获取,工厂类通过参数觉得返回对应的具体产品对象。
- 准备抽象产品、具体产品、工厂类,外部要获取产品对象,需通过工厂类获取,工厂类通过参数觉得返回对应的具体产品对象。
- 定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
-
代理模式
- 定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
- 分类:
- 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。
- 动态:在程序运行时,运用反射机制动态创建而成
- 优点:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能,起到增强;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性。
- 实现:
- 准备抽象主题类、真实主题类、代理类(提供了与真实主题相同的接口),在创建对象时,不是直接new一个真实主题类,而是创建一个代理类,通过代理类来增强逻辑并调用真实主题。
- 准备抽象主题类、真实主题类、代理类(提供了与真实主题相同的接口),在创建对象时,不是直接new一个真实主题类,而是创建一个代理类,通过代理类来增强逻辑并调用真实主题。
-
装饰者模式
- 定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
- 优点:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用;
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果;
- 装饰器模式完全遵守开闭原则。
- 实现
- 定义抽象构件及具体构件(实现类),定义抽象装饰及具体装饰(实现类)。
- 定义抽象构件及具体构件(实现类),定义抽象装饰及具体装饰(实现类)。
学习心得
- 我没有什么项目经验,但是在进行框架学习的过程中,对设计模式的体会也很深刻,特别是工厂模式。我在学习spring框架的过程中,体会到了利用工厂模式解耦的强大。用new关键字创建类,会使类与类之间在编译期耦合度太高,一旦修改被创建类的包信息或者名称等就会编译出错,这不符合我们编译期不依赖的要求;工厂模式真的大大的降低了耦合度,将创建类的工作交给工厂,只需要传入对应名称就能找到对应的类,不需要关注类所在位置及其方法名称,且编译期不出错,符合我们编译期不依赖运行时才依赖的要求。