Java23种设计模式(三)

1、装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

1.1、主要解决的问题

  • 避免通过继承引入静态特征,特别是在子类数量急剧膨胀的情况下。
  • 允许在运行时动态地添加或修改对象的功能。

1.2、使用场景

  • 当需要在不增加大量子类的情况下扩展类的功能。
  • 当需要动态地添加或撤销对象的功能。

2、外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

为一个复杂的子系统提供一个一致的高层接口。这样,客户端代码就可以通过这个简化的接口与子系统交互,而不需要了解子系统内部的复杂性。

2.1、实现方式

  • 创建外观类:定义一个类(外观),作为客户端与子系统之间的中介。
  • 封装子系统操作:外观类将复杂的子系统操作封装成简单的方法。

2.2、应用实例

医院接待:医院的接待人员简化了挂号、门诊、划价、取药等复杂流程。
Java三层架构:通过外观模式,可以简化对表示层、业务逻辑层和数据访问层的访问。

2.3、优点

减少依赖:客户端与子系统之间的依赖减少。
提高灵活性:子系统的内部变化不会影响客户端。
增强安全性:隐藏了子系统的内部实现,只暴露必要的操作。

3、享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

主要解决的问题

  • 避免因创建大量对象而导致的内存溢出问题。
  • 通过共享对象,提高内存使用效率。

使用场景

  • 当系统中存在大量相似或相同的对象。
  • 对象的创建和销毁成本较高。
  • 对象的状态可以外部化,即对象的部分状态可以独立于对象本身存在。

4、代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。

代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的请求转发给目标对象,同时可以在转发请求前后进行额外的处理。

为其他对象提供一种代理以控制对这个对象的访问。

优点

  • 职责分离:代理模式将访问控制与业务逻辑分离。
  • 扩展性:可以灵活地添加额外的功能或控制。
  • 智能化:可以智能地处理访问请求,如延迟加载、缓存等。

缺点

  • 性能开销:增加了代理层可能会影响请求的处理速度。
  • 实现复杂性:某些类型的代理模式实现起来可能较为复杂。

与适配器模式的区别:适配器模式改变接口,而代理模式不改变接口。
与装饰器模式的区别:装饰器模式用于增强功能,代理模式用于控制访问。

实现
我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

ProxyPatternDemo 类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。
在这里插入图片描述
步骤 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();  
   }
}

步骤 4
执行程序,输出结果:

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

5、责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

责任链模式通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。

责任链模式允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

主要解决的问题
解耦请求发送者和接收者,使多个对象都有可能接收请求,而发送者不需要知道哪个对象会处理它。

使用场景
当有多个对象可以处理请求,且具体由哪个对象处理由运行时决定时。
当需要向多个对象中的一个提交请求,而不想明确指定接收者时。

实现方式
定义处理者接口:所有处理者必须实现同一个接口。
创建具体处理者:实现接口的具体类,包含请求处理逻辑和指向链中下一个处理者的引用。

在Java Web开发中,责任链模式有广泛应用,如过滤器链、拦截器等。

6、命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。

命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式结构示意图:

在这里插入图片描述
将请求封装为一个对象,允许用户使用不同的请求对客户端进行参数化。

实现方式

  • 定义命令接口:所有命令必须实现的接口。
  • 创建具体命令:实现命令接口的具体类,包含执行请求的方法。
  • 调用者:持有命令对象并触发命令的执行。
  • 接收者:实际执行命令的对象。

当需要对行为进行记录、撤销/重做或事务处理时,使用命令模式来解耦请求者和执行者。

7、解释器模式

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。

解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

这种模式被用在 SQL 解析、符号处理引擎等。

当某一特定类型的问题频繁出现,并且可以通过一种简单的语言来表达这些问题的实例时。

应用实例

  • 编译器:解释器模式可以用于编译器设计,将源代码解释为目标代码。
  • 正则表达式:解释器模式可以用于解析和执行正则表达式。
  • SQL解析:解释器模式可以用于解析和执行SQL语句。

8、迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
迭代器模式属于行为型模式。
允许顺序访问一个聚合对象中的元素,同时不暴露对象的内部表示。

应用实例
Java中的Iterator:Java集合框架中的迭代器用于遍历集合元素。
优点

  • 支持多种遍历方式:不同的迭代器可以定义不同的遍历方式。
  • 简化聚合类:聚合类不需要关心遍历逻辑。
  • 多遍历支持:可以同时对同一个聚合对象进行多次遍历。
  • 扩展性:增加新的聚合类和迭代器类都很方便,无需修改现有代码。

实例可参考
https://blog.csdn.net/qiyeliuli/article/details/54933483

9、中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性,属于行为型模式。

中介者模式定义了一个中介对象来封装一系列对象之间的交互。中介者使各对象之间不需要显式地相互引用,从而使其耦合松散,且可以独立地改变它们之间的交互。

通过引入一个中介者对象来封装和协调多个对象之间的交互,从而降低对象间的耦合度。

MVC框架:控制器作为模型和视图的中介者。
实现
我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 ChatRoom 方法来分享他们的消息。

MediatorPatternDemo,我们的演示类使用 User 对象来显示他们之间的通信。
在这里插入图片描述
步骤 1
创建中介类。

ChatRoom.java
import java.util.Date;
 
public class ChatRoom {
   public static void showMessage(User user, String message){
      System.out.println(new Date().toString()
         + " [" + user.getName() +"] : " + message);
   }
}

步骤 2
创建 user 类。

User.java
public class User {
   private String name;
 
   public String getName() {
      return name;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   public User(String name){
      this.name  = name;
   }
 
   public void sendMessage(String message){
      ChatRoom.showMessage(this,message);
   }
}

步骤 3
使用 User 对象来显示他们之间的通信。

MediatorPatternDemo.java
public class MediatorPatternDemo {
   public static void main(String[] args) {
      User robert = new User("Robert");
      User john = new User("John");
 
      robert.sendMessage("Hi! John!");
      john.sendMessage("Hello! Robert!");
   }
}

步骤 4
执行程序,输出结果:

Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!
  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值