设计模式: 结构型之享元模式(7)

(第十三章)Java设计模式(二)结构型模式 本文介绍了7种结构型设计模式的Java实现代码示例,包括适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。每种模式都提供了简洁的代码示例和测试类,可直接在IDE中运行。这些模式分别解决了不同场景下的结构设计问题,如接口转换、功能扩展、对象代理、系统封装、维度分离、树形结构处理和对象复用等。所有示例仅使用JDK原生API,无需额外依赖,便于学习和理解核心设计思想。 阅读详情

享元模式概述

  • 享元模式(Flyweight Pattern)是一种用于优化性能的结构型设计模式,它通过共享对象来减少内存中对象的数量
  • 享元模式通常用于当系统中存在大量相同或相似对象时,通过共享这些对象的状态来减少内存消耗
  • 我们会充分利用类型系统的优势来确保内部分享状态和外部状态的有效区分

享元模式示例

/*

结构型- 享元

享元模式运用共享技术有效地支持大量细粒度的对象。

*/

// 定义享元接口 
interface IFlyweight {
  intrinsicState: string; // 内部状态 
  operation(exteriorState: any): void; // 操作方法 
}
 
// 具体享元类(修复实现错误)
class Flyweight implements IFlyweight {
  // 显式声明接口要求的属性 
  intrinsicState: string; 
 
  constructor(private readonly uniqueId: number) {
    // 正确初始化内部状态 
    this.intrinsicState = `stateId-${uniqueId}`;
  }
 
  // 实现接口方法 
  operation(exteriorState: any): void {
    console.log(`internal state: ${this.intrinsicState} and external state: ${exteriorState}`);
  }
}
 
// 享元工厂类(修复类型错误)
class FlyweightFactory {
  private flyweights: Map<number, Flyweight> = new Map();
 
  getFlyweight(uniqueId: number): Flyweight {
    // 检查是否已存在实例 
    if (!this.flyweights.has(uniqueId)) {
      // 创建新实例并存入Map 
      this.flyweights.set(uniqueId, new Flyweight(uniqueId));
    }
    // 明确返回非空对象 
    return this.flyweights.get(uniqueId)!;
  }
}
 
// 使用示例 
const factory = new FlyweightFactory();
 
const context1 = 1;
const context2 = 2;
 
const flyweight1 = factory.getFlyweight(context1);
const flyweight2 = factory.getFlyweight(context2);
 
flyweight1.operation("External state A");
flyweight2.operation("External state B");
 
// 复用已存在的享元对象 
const flyweight3 = factory.getFlyweight(context1);
flyweight3.operation("External state C");
 
console.log(flyweight1 === flyweight3); // 输出:true 
  • 这个使用Typescript来实现的示例
  • 在这个例子中,ConcreteFlyweight 类代表具体的享元对象
  • 它包含了内部状态(在这里是唯一标识符)
  • Flyweight 接口定义了享元对象的操作方法,其中外部状态作为参数传递
  • FlyweightFactory 类作为一个工厂,它维护了一个享元对象的缓存池(Map)
  • 当请求一个新对象时,如果该内部状态的对象已经存在,则直接返回现有对象,否则创建新的对象并加入缓存池中
  • 这样,对于具有相同内部状态的不同外部状态请求,系统能够有效降低对象的数量,从而节约内存和提高性能

享元模式的应用场景

  • 享元模式是一种结构型设计模式,主要用于减少内存中对象的数量,从而优化系统性能。它通过共享对象的状态来实现这一目标
  • 以下是享元模式的主要应用场景

1 )系统中存在大量相似对象

  • 当系统中存在大量相似对象,且这些对象的某些部分状态可以共享时,可以使用享元模式
  • 通过共享这些状态,可以大幅度减少需要创建的对象数量,避免大量相似对象的开销,从而提高系统资源的利用率
  • 例如,在游戏开发中,棋子、角色等对象常常具有相似的属性和状态,使用享元模式可以有效地减少内存占用并提高性能

2 )对象的创建和销毁成本较高

  • 如果对象的创建和销毁需要消耗大量的资源,或者对象的初始化过程非常复杂,那么使用享元模式可以减少资源的消耗
  • 通过复用已有的对象,可以避免频繁地创建和销毁对象,从而降低系统的开销

3 )状态可以分为内部状态和外部状态

  • 享元模式要求将对象的状态分为内部状态和外部状态
  • 内部状态是对象不可变的共享部分,而外部状态是可以改变的独立部分
  • 当多个客户端请求同一个享元对象时,它们实际上共享的是同一个对象的内部状态,而外部状态则可以根据需要进行调整
  • 这种分离使得对象的复用更加灵活和高效

4 )需要精细控制对象共享

  • 在某些情况下,需要对对象的共享进行精细化控制
  • 通过享元工厂来管理享元对象的创建和共享,可以确保对象的共享是有序和可控的
  • 享元工厂可以维护一个对象池,根据需要提供共享对象,避免无限制地创建新对象

5 ) 其他

  • 除了上述场景外,享元模式还常常应用于系统底层的开发,如数据库连接池、字符串池等
  • 在这些场景中,通过复用已有的连接或字符串对象,可以减少资源的消耗并提高系统的性能

6 )总结

  • 总的来说,享元模式适用于那些需要优化内存使用、减少对象创建和销毁成本、以及需要精细控制对象共享的场景
  • 通过共享对象状态,享元模式可以有效地提高系统的性能和资源利用率
  • 但需要注意的是,享元模式可能会增加代码的复杂性,因此在应用时需要权衡其优缺点,并根据具体需求进行决策
Android 集成Chrome 浏览器内核 Crosswalk Crosswalk 内核的兴起与消亡 Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView 但实际上,由于 Android 的碎片化问题(大量存在不同的 Android 系统版本,并且各个厂商对内置应用进行定制化,有可能用的不是最新的浏览器内核)。这就导致 WebView 在真实环境中对 API 的支持根本无迹可寻,越发混乱。 随着混合开发的兴起,前端对 ... 阅读详情

相关推荐

当NetApp 7-mode遇到单控制器故障:HA模式手动修复全记录

本文详细记录了NetApp 7-mode存储系统在单控制器故障时的应急修复过程,包括HA配置重建、磁盘初始化和业务恢复等关键步骤。通过实战案例解析如何解决`VIA Interconnect is down`等典型问题,为企业级存储系统的高可用保障提供实用指南。

yolo5detector的博客 247

设计模式学习笔记 - 设计模式与范式 -结构型:7.享元模式(上):享元模式原理和应用

1.享元模式的原理所谓 “享元”,就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象时不可变对象。具体来讲,当一个系统中存在大量重复对象的时候,就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样可以减少内存中对象的数量,以及起到节省内存的目的。实际上,不仅仅相同的对象可以设计成享元,对于相似的对象,也可以将这些对象中相同的部分(字段),提取出来设计成享元,让这些大量相似对象引入这些享元。2.享元模式的实现。

chenjian723122704的专栏 861

机器学习ROC曲线中的阈值thresholds

在ROC曲线上的不同点对应于不同的阈值。根据任务的具体要求,可以选择合适的阈值,以达到平衡召回率和误报率,或者根据具体应用场景调整模型的工作点。,表示样本属于正例的概率。这个概率值可以被截断为二元分类的决策,通过选择一个阈值来决定样本是被分类为正例还是负例。通过改变阈值,可以得到不同的真正例率(TPR)和假正例率(FPR),从而绘制出ROC曲线。总体来说,ROC曲线提供了模型在不同阈值下的性能综合情况,帮助分析模型的分类能力。通常来说,随着阈值的增加,TPR会减小,而FPR会增加。ROC曲线的绘制涉及。

行子的博客 3657

设计模式之结构型模式(适配器、桥接、组合、享元、装饰者、外观、代理)

设计模式之结构型模式(适配器、桥接、组合、享元、装饰者、外观、代理)

今天你学Java了吗 786

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

liang007dudu的博客 1万+

记录思科cisco交换机升级iso步骤

Cisco Nexus 93180交换机版本升级

a635161812的博客 4378

设计模式(三):结构型模式之代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式

设计模式之结构型模式 一、概述 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下7种: 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。 适配器(Adapter)模式:将一个类的接

HX_2021 717

用VINS-Fusion跑通EuRoC数据集:Ubuntu22.04+ROS2环境下的保姆级评测指南

本文详细介绍了在Ubuntu22.04和ROS2 Humble环境下使用VINS-Fusion处理EuRoC数据集的完整流程。从环境配置、数据集转换到参数调优和性能评估,提供了一套全面的多传感器融合分析方案,帮助开发者在无人机精准定位场景中实现高效部署与优化。

weixin_29212867的博客 518

【23种设计模式】结构型模式详细介绍

本文为 【23种设计模式】结构型模式 相关内容介绍,下边将对适配器模式,桥接模式,组合模式,装饰模式,外观模式,亨元模式,代理模式,具体包括它们的特点与实现等进行详尽介绍~

小新要变强的博客 1418

银河麒麟(桌面版/服务器版)远程桌面配置全攻略:XRDP与VNC实战指南

本文提供了银河麒麟操作系统(桌面版与服务器版)配置远程桌面的完整实战指南。详细对比并演示了XRDP与VNC两种主流方案的安装、配置与连接步骤,涵盖从环境准备、软件安装、服务启动到客户端连接的全过程,并针对常见的黑屏、连接失败等问题给出了有效的排坑解决方案,帮助用户实现跨平台的便捷图形化远程管理。

b0c1d2的博客 814

42、InfiniBand技术详解:QP状态机、操作及错误处理

本文深入解析InfiniBand技术中的核心组件QP(Queue Pair)状态机、工作请求处理机制、支持的操作类型及错误处理策略。详细介绍了QP的创建与状态转换流程,包括INIT、RTR、RTS等关键状态,并提供了状态修改的代码示例。文章还探讨了工作请求的发布、资源使用限制、围栏机制以及重试和RNR流程,帮助开发者理解通信可靠性保障机制。此外,涵盖了多播组的应用场景与API使用方法,并对比了用户空间与内核级RDMA API的调用差异,最后给出了实践建议和常见问题解答,为构建高性能分布式系统提供技术指导。

oauth7security的博客 133

python设计模式(二)结构型模式

结构型模式(7种):适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式 https://www.bilibili.com/video/BV19541167cn?spm_id_from=333.999.0.0 1、适配器模式 适配器模式 内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 两种实现方式: 类适配器:使得多继承 对象适配器:使用组合 角色: 目标接口 待适配的类 适配器 适用场景 想使用一个已

Tacit_zfy99的博客 227

GEO的工作原理,以及GEO会催生出更多的爬虫岗位吗?

摘要: GEO(生成式引擎优化)是提升内容在AI搜索(如ChatGPT、Perplexity等)中引用率的新策略,核心在于优化内容的可抓取性、语义清晰度、权威性。与传统SEO不同,GEO聚焦AI的引用逻辑,需通过爬虫监控AI回答、逆向分析引用源特征(如结构化数据、权威背书),并构建自动化工具优化内容。爬虫工程师需转型为“AI可见性基础设施构建者”,重点关注高权威站点、知识库及官方信息源,同时确保技术可抓取性(如放行AI爬虫UA)。GEO的核心是从“排名”转向“被AI引用”,强调实体识别与动态对话适配。

数据知道的博客 4642

设计模式三

7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 6、适配器模式(Adapter) 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看类的适配器模式,先看类图...

weixin_30455661的博客 83

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java开发中的23种设计模式详解(2)结构型

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图:  适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首...

乐在克里特 152

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java开发中的23种设计模式详解之二:7种结构型模式

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图:  适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模

Alex ♋ 博客 5170

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java之美[从菜鸟到高手演变]之设计模式二

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 6、适配器模式(Adapter)  适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配

World_2015的专栏 1210

Java设计模式之结构型七大模式

这一篇我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 下面我对这七个模式,进行的是自己我总结和对比,具体见图: 下面开始讲这七个模式 1 适配器模式 1, 适配器模式  适配器模式将某个类的接口转换

swimming_in_IT_的博客 705

设计模式全解(二)

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 6、适配器模式(Adapter)  适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三

好学若饥,谦卑若愚 4万+

设计模式四

7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 6、适配器模式(Adapter) 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看类的适配器模式,先看类图...

weixin_30371469的博客 94

关于设计模式的学习—结构型模式

结构型包括适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式,共7种模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 1、适配器模式 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。分别是对类、对象和接口进行转换。 类的适配器

shuzl213的博客 296

设计模式(中篇:结构型)

2.结构型 2.1 适配者模式 适配一个接口 2.2 桥接模式 2.3 代理模式 相当于对象分身 任何时候都能用到Proxy? 代码 应用: 远程代理: 虚拟代理:对象创建开销大,存放实例化时间长,比如网页中的图片框替代真实图片 安全代理:控制真实对象的访问权限 2.4 享元模式 2.5 装饰模式 动态地给对象添加额外的职责 (为已有功能动态添加更多功能) 将核心职责和装饰功能结合 2.6 组合模式 2.7 外观模式 提供简单接口,减少依赖,复用复杂且重复代码 3.行为

柚子的博客 1030

设计模式:结构型模式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33672400的博客 118

设计模式-7种结构型

结构型设计模式有7种,分别是: 适配器模式 桥接模式 组合模式 装饰模式 代理模式 外观模式 享元模式 适配器模式:手机充电5V,居民入户220V,中间新增个适配类,提供接口将220V转换为5V,然后将结果输出给手机。 桥接模式:平等类的组合。形状抽象类的子类有各种形状,颜色抽象类的子类有各种形状。可以将颜色合成/聚合为各形状子类的成员,提供赋值接口。从而实现各种形状和各种颜色的组合。 组合模式:整体与部分的组合。管理者和雇员的例子。管理者也是雇员,有职位等属性,比雇员多了下属成员等属性。将相同的部分合并为

m0_38036892的博客 304

设计模式——结构型模式

文章目录1、适配器模式介绍实现步骤 1步骤 2步骤 3步骤 4步骤 52、组合模型介绍实现步骤 1步骤 23、装饰器模式介绍实现步骤 1步骤 2步骤 3步骤 4步骤 54、代理模式介绍实现步骤 1步骤 2步骤 35、享元模式介绍实现步骤 1步骤 2步骤 3步骤 46、外观模式介绍实现步骤 1步骤 2步骤 3步骤 47、桥接模式介绍实现步骤 1步骤 2步骤 3步骤 4步骤 5 1、适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合

前尘忆梦的博客 1408

Java进阶——学习Java 23种设计模式详解笔记之结构型模式(二)

结构型设计模式上篇文章创建型设计模式学习完了5种创建型模式,这章开始,接下来将学习下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

最美不过,心中有梦,身旁有你! 1021
上一篇: 设计模式: 结构型之组合模式(6)
下一篇: 设计模式: 结构型之适配器模式(8)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值