开闭原则(对扩展开放;对修改封闭)
需求是时刻在变化的,开闭原则就是在面对新需求是尽可能的保持代码稳定,核心思想是对可能变化的部分抽象。
开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所生成的巨大好处,也就是可维护、可扩展、可服用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那部分抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。切记。
里氏代换原则
一个软件的实体如果使用的是一个父类,那么一定使用其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类替换成子类的话,程序的行为没有变化。
依赖倒转原则
- 高层模块不应依赖底层模块。两个都应该依赖抽象
- 抽象不应该依赖细节。易接应该依赖抽象
工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
public interface Car
{
public void drive();
}
//具体产品角色
public class Benz implements Car
{
public void drive() {
System.out.println("Driving Benz ");
}
}
public class Bmw implements Car
{
public void drive()
{
System.out.println("Driving Bmw ");
}
}
2.工厂方法模式
工厂方法模式克服了简单工厂违背 开放-封闭原则的缺点,又保持了分装对象创建过程的有点。工厂方法模式是简单工厂模式的进一步抽象和推广。
工厂方法模式的缺点:每添加一个生成产品,就要多加一个生产该产品的工厂,增加了额外开发量。
3.抽象工厂模式
单例模式
饿汉模式:线程安全,构造函数不暴露,提供一个获取接口,单例在代码被运行时创建
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
懒汉模式:多线程不安全,在JAVA中用了synchronized 字段限制规避多线程出现多个单例
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance;
}
}
简单写法:
public static final Singleton INSTANCE = new Singleton();
建造模式
原型模式
适配器模式
举例:
桥梁模式
组合模式
组合(Composite)模式的其它翻译名称也很多,比如合成模式、树模式等等。在《设计 式》一书中给出的定义是:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
外观模式
类1对一些类(类2-类N)实例的封装, 构造函数时创建所有类的实例,当调用类1某个函数时,执行类2-类N的某些函数
装饰模式
感觉很鸡肋
代理模式
模板方法模式
迪米特法则
如果两个类没有直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某个方法,可通过第三者转发这个调用。
观察者模式
观察者模式又叫发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个对题对象在状态发生变化时,会通知所有观察者。
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
实际应用:员工一天的状态分为:早、中、下、晚、休息状态,抽象每一个状态并随着时间变化切换状态。如果有新需求,时间大于20点则强制休息下班,则修改晚上的工作状态即可,到达时间强制切换到休息状态。
备忘录模式
在不破坏封装性的前提下,补货一个对象的内部状态,并在该状态之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
桥接模式