简介
软件模式基础结构
- 问题描述:待解决的问题是什么
- 前提条件:在任何环境和约束条件下使用
- 解法:关联解法和其它相关模式
- 效果:优缺点
作用
设计模式是为了可重用代码,保证代码可靠性,及使代码更容易被他人所理解。设计模式可使代码编制真正工程化。每种设计模式都描述了一个我们周围不断发生的问题,以及该问题的核心解决方案。
面向对象设计原则
- 单一职责原则(SRP,Simple Responsibility Principe)
一个类只负责一个功能领域中的相应职责。
用于控制类的粒度的大小,就一个类而言,应该只有一个引起它变化的原因。
- 开闭原则(OCP,Open Close Principe)
软件实体应对扩展开放,而对修改关闭。即在程序需要扩展时,不去修改原有的代码,实现一个热插拔的功能。
想要达到这样的效果,我们需要使用接口和抽象类。
改进:策略模式
a. 增加一个抽象图标类AbstractChart将各种具体图表作为其子类
b. ChartDisplay类对抽象图表类进行编程,由客户端决定使用哪种具体图表
- 里氏替换原则(LSP,Liskov Substitution Principle)——实现开闭原则的重要方式之一
任何基类可以出现的地方,子类一定可以出现。
LSP是继承复用的基石,只有当派生类可以替换基类,且软件单位的功能不受到影响时,基类才能被真正的复用,而派生类也能够在基类的基础上增加新的行为。
注意点:
a. 子类的所有方法必须在父类中声明或子类必须实现父类中声明的所有方法
b. 运用该原则时,尽量把父类设计为抽象类或接口,让子类继承父类或实现父接口,并实现父类中声明的方法。
c. java程序在编译阶段,java编译器会检查一个程序是否符合里氏替换原则,这是一个与实现无关的,纯语法意义上的检查。 - 依赖倒转原则(DIP,Dependence Inversion Principe)——开闭原则的基础
针对接口编程,抽象不应该依赖于细节,细节应该依赖于抽象
注意点:
a. 要求我们在程序代码编写中传递参数时或在关联关系中,尽量引用高层次的抽象层类,即使用接口或抽象类进行变量类型声明,参数类型声明,方法返回类型声明,以及数据类型的转换等,而不是用具体类来做这些事情。因此一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法。
b. 在引入抽象层后,系统将具有很好的灵活性,在程序中使用抽象层进行编程,而将具体实现类写在配置文件中,这样一来,如果系统行为发生变化,只需要对抽象层进行扩展,并修改配置文件,而不需修改原有系统源代码,在不修改的情况下扩展系统的功能,满足开闭原则的要求。
c. 实现依赖倒转原则时,针对抽象层编程,而将具体类的对象通过依赖注入(DI)的方式注入到其它对象中。DI即当一个对象要与其它对象发生依赖关系时,通过抽象来注入所依赖的对象。分为构造器注入、设置注入(setter注入)和接口注入(通过接口中声明的业务方法来传入具体类的对象)。 - 接口隔离原则(ISP,Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口好。
目的是降低依赖,降低耦合。 - 合成复用原则(CRP,Composite Reuse Principle)
尽量使用合成的模式,而不是使用继承
继承会将基类的实现细节暴露给子类,称为“白箱”复用。
合成是将已有对象(也可称为成员对象)纳入到新对象中,使之成为新对象的一部分。这样做使成员对象的内部实现细节对新对象是不可见的,称为“黑箱”复用。 - 迪米特法则/最少知道原则(LOD, Law of Demeter)
一个实体应当尽量少的与其它实体之间发生相互作用,使得系统功能模块相对独立。
限制了软件通信的宽度和深度。符合两项原则:
1、不要和“陌生人”说话
2、只与你的直接朋友通信
对于一个对象,其朋友定义如下:
1、当前对象本身(this)
2、以参数形式传入到当前对象方法中的对象
3、当前对象的成员对象,如果成员对象是一个集合,那么集合中的所有元素都是朋友
4、当前对象所创建的对象
类型
-
创建型模式
提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
包含:
工厂模式(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)