# 设计模式和设计原则
# 资料参考
# 6/7大设计原则
记忆口诀:开口合里最单依
- 开闭原则
- 接口隔离原则
- 聚合原则
- 里式替换原则
- 最少知识原则
- 单一职责原则
- 依赖倒置原则
最少知识原则: 一个类,应该对其他类的信息应该知道尽量少。对依赖者来说只依赖应该依赖的类, 对提供者来说只暴露应该暴露的方法。 就是说,我调用一个方法,不管这个方法内部多么复杂, 对于调用者来只需要调用这个方法就能完全对应的行为逻辑。
单一职责原则: 一个类负责一个一项职责,也就是属于同一项职责的代码需放在同一个类中实现。
使用外观模式,单例模式实现,缺点:不符合开闭原则。
开闭原则:
对修改关闭,对扩展开放。 开发新功能,不应该修改原有代码,而是通过拓展的方式。大理模式符合这个原则。
依赖倒置原则:
高层模块不应该依赖底层模块,两者应该依赖其抽象。 这就是就是面向接口编程的思想。
代理模式符合这个原则。
接口隔离原则: 建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用
里式替换原则
**定义:**所有父类的对象, 都可以替换为子类对象,并且不会破坏程序,改变程序行为。 **解释:**子类继承父类, 应该是扩展父类,而不是重写父类的行为。如果为了实现多态重写父类方法, 那父类应该为抽象类。 父类为抽象类时,不能够直接实例化父类。 所以和这个原则定义也不冲突。 **总结:**总结来说就是, 如果父类不是抽象类,不应该复写父类的方法。
聚合原则:
能组合,不继承。
代理模式实现这个这个原则。
步骤 1
创建一个接口。
Image.java
public interface Image {
void display();
}
步骤 2
创建实现接口的实体类。
RealImage.java
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
ProxyImage.java
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
步骤 3
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
ProxyPatternDemo.java
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
比如封装支付Sdk,应该抽象出一个接口出来,不同的支付方式去实现这个接口。
在使用支付Sdk时, 只需要实例化对应的支付方式即可。 新增支付方式只需要
高层(比如)
这就是平常说的面向接口编程。
策略模式
去除if else
# 23种设计模式
# 设计模式的分类
创建型
负责对象的创建
结构型
负责通过组合多个不同的对象来提供统一的方法
行为型
负责对象之间的通信
# 常用的一些设计模式
# 创建型
- 单例
- 工厂方法
- 抽象工厂
- 建造者
# 结构性
- 适配器
- 代理
- 门面(外观)
- 享元
- 装饰
# 行为型
- 观察者
- 策略
- 模板方法
- 责任链
# 实例应用
门面-单例-
# 单例模式
private volatile static DBHelper instance; //1:volatile修饰
private DBHelper() {
init();
}
public static DBHelper getInstance() {
if (instance == null) { //2:减少不要同步,优化性能
synchronized (DBHelper.class) { // 3:同步,线程安全
if (instance == null) {
instance = new DBHelper(); //4: 对象
}
}
}
return instance;
}
private void init(){
};