# 设计模式和设计原则

# 资料参考

# 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(){

};
Last Updated: 1/9/2024, 11:22:13 AM