首页 > 其他分享 >结构者设计模式

结构者设计模式

时间:2024-09-11 12:52:34浏览次数:12  
标签:void Component 接口 class operation 设计模式 public 结构

结构者模式(Structural Design Patterns)指的是一组设计模式,旨在帮助设计者将对象或类组合成更大的结构,以便于形成更复杂的系统。这些模式关注如何将对象或类组织起来,以构建更大的结构或系统。主要目的是提高系统的灵活性和可维护性。

常见的结构者模式包括:

  1. 适配器模式(Adapter Pattern)
  2. 桥接模式(Bridge Pattern)
  3. 组合模式(Composite Pattern)
  4. 装饰者模式(Decorator Pattern)
  5. 外观模式(Facade Pattern)
  6. 享元模式(Flyweight Pattern)
  7. 代理模式(Proxy Pattern)

1. 适配器模式(Adapter Pattern)

目的:将一个类的接口转换成客户端所期望的另一个接口,使得原本接口不兼容的类可以协同工作。

结构

  • 目标接口(Target Interface):客户端期望的接口。
  • 适配者(Adaptee):已经存在的接口,接口与客户端的期望接口不兼容。
  • 适配器(Adapter):实现目标接口,并将客户端请求转发到适配者对象。

示例代码(Java)


java

复制代码

// 目标接口 interface Target { void request(); } // 适配者 class Adaptee { void specificRequest() { System.out.println("Specific request"); } } // 适配器 class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); } } // 客户端代码 public class Main { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target target = new Adapter(adaptee); target.request(); } }

2. 桥接模式(Bridge Pattern)

目的:将抽象部分与实现部分分离,使得两者可以独立变化。

结构

  • 抽象类(Abstraction):定义抽象的接口。
  • 修正抽象类(RefinedAbstraction):扩展抽象类。
  • 实现接口(Implementor):定义实现类的接口。
  • 具体实现类(ConcreteImplementor):实现实现接口。

示例代码(Java)


java

复制代码

// 实现接口 interface Implementor { void operationImpl(); } // 具体实现类 class ConcreteImplementorA implements Implementor { @Override public void operationImpl() { System.out.println("ConcreteImplementorA operation"); } } // 抽象类 abstract class Abstraction { protected Implementor implementor; protected Abstraction(Implementor implementor) { this.implementor = implementor; } abstract void operation(); } // 修正抽象类 class RefinedAbstraction extends Abstraction { protected RefinedAbstraction(Implementor implementor) { super(implementor); } @Override void operation() { implementor.operationImpl(); } } // 客户端代码 public class Main { public static void main(String[] args) { Implementor impl = new ConcreteImplementorA(); Abstraction abs = new RefinedAbstraction(impl); abs.operation(); } }

3. 组合模式(Composite Pattern)

目的:允许客户以一致的方式处理单个对象和对象集合。

结构

  • 组件接口(Component):声明叶子和容器的共同接口。
  • 叶子(Leaf):实现组件接口,表示树的叶节点。
  • 容器(Composite):实现组件接口,表示树的节点,包含子组件。

示例代码(Java)


java

复制代码

import java.util.ArrayList; import java.util.List; // 组件接口 interface Component { void operation(); } // 叶子 class Leaf implements Component { @Override public void operation() { System.out.println("Leaf operation"); } } // 容器 class Composite implements Component { private List<Component> children = new ArrayList<>(); void add(Component component) { children.add(component); } void remove(Component component) { children.remove(component); } @Override public void operation() { for (Component child : children) { child.operation(); } } } // 客户端代码 public class Main { public static void main(String[] args) { Component leaf1 = new Leaf(); Component leaf2 = new Leaf(); Composite composite = new Composite(); composite.add(leaf1); composite.add(leaf2); composite.operation(); } }

4. 装饰者模式(Decorator Pattern)

目的:动态地给对象添加功能,不改变其结构。

结构

  • 组件接口(Component):定义对象的接口。
  • 具体组件(ConcreteComponent):实现组件接口的基本对象。
  • 装饰器(Decorator):持有一个组件对象的引用,并提供相同的接口。
  • 具体装饰器(ConcreteDecorator):扩展装饰器,添加额外的功能。

示例代码(Java)


java

复制代码

// 组件接口 interface Component { void operation(); } // 具体组件 class ConcreteComponent implements Component { @Override public void operation() { System.out.println("ConcreteComponent operation"); } } // 装饰器 abstract class Decorator implements Component { protected Component component; protected Decorator(Component component) { this.component = component; } @Override public void operation() { component.operation(); } } // 具体装饰器 class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } @Override public void operation() { super.operation(); additionalOperation(); } private void additionalOperation() { System.out.println("ConcreteDecorator additional operation"); } } // 客户端代码 public class Main { public static void main(String[] args) { Component component = new ConcreteComponent(); Component decorator = new ConcreteDecorator(component); decorator.operation(); } }

5. 外观模式(Facade Pattern)

目的:为复杂子系统提供一个统一的接口,使得子系统更易于使用。

结构

  • 外观类(Facade):提供一个简单接口,隐藏子系统的复杂性。
  • 子系统类(Subsystem):复杂的子系统类,提供具体功能。

示例代码(Java)


java

复制代码

// 子系统类 class SubsystemA { void operationA() { System.out.println("SubsystemA operation"); } } class SubsystemB { void operationB() { System.out.println("SubsystemB operation"); } } // 外观类 class Facade { private SubsystemA subsystemA = new SubsystemA(); private SubsystemB subsystemB = new SubsystemB(); void operation() { subsystemA.operationA(); subsystemB.operationB(); } } // 客户端代码 public class Main { public static void main(String[] args) { Facade facade = new Facade(); facade.operation(); } }

6. 享元模式(Flyweight Pattern)

目的:通过共享对象来减少内存消耗,提高效率。

结构

  • 享元接口(Flyweight):声明操作方法。
  • 具体享元(ConcreteFlyweight):实现享元接口,处理共享的状态。
  • 享元工厂(FlyweightFactory):管理享元对象的创建和共享。

示例代码(Java)


java

复制代码

import java.util.HashMap; import java.util.Map; // 享元接口 interface Flyweight { void operation(String extrinsicState); } // 具体享元 class ConcreteFlyweight implements Flyweight { private String intrinsicState; public ConcreteFlyweight(String intrinsicState) { this.intrinsicState = intrinsicState; } @Override public void operation(String extrinsicState) { System.out.println("Intrinsic State: " + intrinsicState + ", Extrinsic State: " + extrinsicState); } } // 享元工厂 class FlyweightFactory { private Map<String, Flyweight> flyweights = new HashMap<>(); Flyweight getFlyweight(String intrinsicState) { if (!flyweights.containsKey(intrinsicState)) { flyweights.put(intrinsicState, new ConcreteFlyweight(intrinsicState)); } return flyweights.get(intrinsicState); } } // 客户端代码 public class Main { public static void main(String[] args) { FlyweightFactory factory = new FlyweightFactory(); Flyweight flyweight1 = factory.getFlyweight("StateA"); flyweight1.operation("ExtrinsicA"); Flyweight flyweight2 = factory.getFlyweight("StateA"); flyweight2.operation("ExtrinsicB"); Flyweight flyweight3 = factory.getFlyweight("StateB"); flyweight3.operation("ExtrinsicC"); } }

7. 代理模式(Proxy Pattern)

目的:为其他对象提供一种代理以控制对该对象的访问。

结构

  • 抽象主题(Subject):定义真实对象和代理对象的共同接口。
  • 真实主题(RealSubject):实际实现对象的类。
  • 代理(Proxy):持有对真实主题对象的引用,并控制对它的访问。

示例代码(Java)


java

复制代码

// 抽象主题 interface Subject { void request(); } // 真实主题 class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject request"); } } // 代理 class Proxy implements Subject { private RealSubject realSubject; @Override public void request() { if (realSubject == null) { realSubject = new RealSubject(); } System.out.println("Proxy request"); realSubject.request(); } } // 客户端代码 public class Main { public static void main(String[] args) { Subject proxy = new Proxy(); proxy.request(); } }

总结

结构者模式帮助我们以不同的方式组织和构建系统中的类和对象,从而提高系统的灵活性和可维护性。通过合理选择和应用这些模式,可以有效地管理和扩展系统的复杂性。

标签:void,Component,接口,class,operation,设计模式,public,结构
From: https://blog.csdn.net/m0_68570169/article/details/142110398

相关文章

  • PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性
    目录前言PointCNN实现细节1.XXX-Conv操作输入输出步骤2.PointCNN网络架构层级卷积分类与分割任务......
  • OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述测试轮廓的凸性。该函数测试输入的轮廓是否为凸的。轮廓必须是简单的,即没有自相交。否则,函数的输出是不确定的。cv::isContourConvex函数是OpenCV提供的一个用于判断轮廓是否......
  • OpenCV结构分析与形状描述符(16)判断两个凸多边形是否相交的函数intersectConvexConvex(
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述查找两个凸多边形的交集。intersectConvexConvex是一个在OpenCV中用于判断两个凸多边形是否相交的函数。此函数可以帮助我们确定两个二维凸多边形是否在平面上有重叠区域。函......
  • 设计模式-映射器(Mapper)
    概念在两个独立的对象之间建立通信的对象背景有时,需要在两个子系统之间通信,同时还必须隔离它们,而且还不想建立子系统间的依赖关系。运行机制映射器是子系统之间的绝缘层,控制着子系统间的通信细节;映射器通常需要在层与层之间进行数据交互。可以由使用映射器的第三方系统激......
  • 设计模式-入口(Gateway)
    入口是一个封装外部系统或资源访问的对象背景即使是纯粹的面向对象系统,通常也要处理一些不是对象的事务,例如关系数据库、CICS事务和XML数据结构。问题一般通过API访问外部资源。对API的理解是开发过程的必经之路,不仅软件的可读性差,使软件修改变也变得困难。解决途径......
  • 【LabVIEW学习篇 - 24】:生产者/消费者设计模式
    文章目录生产者/消费者设计模式案例:控制LED等亮灭生产者/消费者设计模式生产者/消费者是多线程编程中最基本的一种模式,使用非常普遍。从软件角度看,生产者就是数据的提供方,而消费者就是数据的消费处理方,二者之间存在一个数据缓存区。在新建中可创建生产者/消费者......
  • 【设计模式】装饰模式
    1.不好的代码(冗杂)//业务操作classStream{public:virtualcharRead(intnumber)=0;virtualvoidSeek(intposition)=0;virtualvoidWrite(chardata)=0;virtual~Stream(){}};//主体类classFileStream:publicStream{public:vir......
  • 可持久化数据结构
    可持久化线段树看这个。可持久化字典树最大异或和考虑设\(s\)为\(a\)的前缀异或和数组,我们最终的答案就是找一个\(p\in[l-1,r-1]\),然后求出\(s_n\operatorname{xor}x\operatorname{xor}s_p\)。首先,对于最大异或数对问题,可以使用\(01\)\(trie\)解决,这里不再赘述。......
  • 基于深度学习的蛋白质结构预测
    基于深度学习的蛋白质结构预测是利用深度学习模型来预测蛋白质的三维结构,这在生物学和药物研发领域具有重要意义。蛋白质的功能在很大程度上取决于其三维结构,准确预测蛋白质结构可以帮助科学家理解蛋白质的功能和相互作用,并加速药物发现的进程。1.蛋白质结构预测的挑战结构......
  • 网络编程day03(网络体系结构、调试命令、TCP/IP对比)
    目录1》网络的体系结构1>OSI模型 2>TCP/IP模型3>常见网络协议4> DNS域名解析协议2》网络调试命令1>ping:测试网络连通性(ICMP)2>netstat  3》Dos(拒绝式服务)攻击? 4》 TCP/IP协议对比1》网络的体系结构网络采用分而治之的方法设计,将网络的功能划分为不......