【设计模式】11-15:迪米特拉(最小知识)原则、外观模式、建造者模式、观察者模式、抽象工厂模式

十一、迪米特拉原则/最小知识原则

如果两个类直接进行通信,那么这两个类就不能存在关系

调用其他类的方法时,需要第三个类实现转发-->外观类

尽量降低类的访问权限

十二、外观模式

隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式

使用高级外观类,管理子类,可以减少子系统之间的依赖

使用外观类做复杂交互

public class ShapeMaker {
   private Shape circle;
   private Shape rectangle;
   private Shape square;
 
   public ShapeMaker() {
      circle = new Circle();
      rectangle = new Rectangle();
      square = new Square();
   }
 
   public void drawCircle(){
      circle.draw();
   }
   public void drawRectangle(){
      rectangle.draw();
   }
   public void drawSquare(){
      square.draw();
   }
}

十三、建造者模式

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示

使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式

可以方便的实现扩展

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"

 

十四、观察者模式

定义对象间的一种一对多的依赖关系,多个对象同时监听当前对象的主题

主题对象发生变化时,会自动通知依赖它的对象,进行更新

本质:让耦合的双方依赖于抽象,而不是依赖于自己(是抽象耦合的)

一般通过接口进行实现

观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。

 

十五、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

缺点:代码臃肿

 

易于扩展(增加子类/增加颜色,或增加一个特性)

public class AbstractFactoryPatternDemo {
   public static void main(String[] args) {
 
      //获取形状工厂
      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
 
      //获取形状为 Circle 的对象
      Shape shape1 = shapeFactory.getShape("CIRCLE");
 
      //调用 Circle 的 draw 方法
      shape1.draw();
 
      //获取形状为 Rectangle 的对象
      Shape shape2 = shapeFactory.getShape("RECTANGLE");
 
      //调用 Rectangle 的 draw 方法
      shape2.draw();
      
      //获取形状为 Square 的对象
      Shape shape3 = shapeFactory.getShape("SQUARE");
 
      //调用 Square 的 draw 方法
      shape3.draw();
 
      //获取颜色工厂
      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
 
      //获取颜色为 Red 的对象
      Color color1 = colorFactory.getColor("RED");
 
      //调用 Red 的 fill 方法
      color1.fill();
 
      //获取颜色为 Green 的对象
      Color color2 = colorFactory.getColor("Green");
 
      //调用 Green 的 fill 方法
      color2.fill();
 
      //获取颜色为 Blue 的对象
      Color color3 = colorFactory.getColor("BLUE");
 
      //调用 Blue 的 fill 方法
      color3.fill();
   }
}

 

posted @ 2022-01-12 11:27  哥们要飞  阅读(33)  评论(0编辑  收藏  举报