Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java经典23结构模型的设计模式(三)——附加代理模式、适配器型号、Facade模式的差异

Java经典23结构模型的设计模式(三)——附加代理模式、适配器型号、Facade模式的差异

作者头像
全栈程序员站长
发布于 2022-07-05 13:56:43
发布于 2022-07-05 13:56:43
4130
举报

大家好,又见面了,我是全栈君

本文介绍了7样的结构模型中的其余2种:轻量级、代理模式。

一、享元模式FlyWeight

享元模式比較简单且重要,在非常多场合都被用到。仅仅只是封装起来了用户看不到。其概念:运用共享内存技术最大限度的支持大量细粒度的对象。

这个概念给的有些抽象,说白了就是假设内存中存在某个对象A。假设再次须要使用对象A的时候假设内存中有A这个对象就直接使用它,不要再次new了。假设没有,则又一次new一个。基于这个特点,享元模式使用时通常会给待訪问对象传递一个Tag,用来标识这个对象,并且要同一时候使用抽象工厂的方法进行訪问。

有点相似单例模式,仅仅只是单例内存中仅仅有一个对象,而享元模式是确保同样Tag的对象有且仅仅有一个。

1.Flyweight 描写叙述一个接口,通过这个接口flyweight能够接受并作用于外部状态。

public interface Flyweight { void action(int arg); }

2.ConcreteFlyweight实现Flyweight接口,并为内部状态(假设有的话)添加存储空间。ConcreteFlyweight对象必须是可共享的。

它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。

public class FlyweightImpl implements Flyweight {

public void action(int arg) { // T*DO Auto-genera*ed method stub System.out.println(*參数值: ” + arg); } }

3. FlyweightFactory 创建并管理flyweight对象。确保合理地共享flyweight。当用户请求一个flyweight时,flyweightFactory对象提供一个已创建的实例或者创建一个(假设不存在的话)。

public class FlyweightFactory {

private static Map flyweights = new HashMap(); public FlyweightFactory(String arg) { flyweights.put(arg, new FlyweightImpl()); } public static Flyweight getFly*eight(String key) { if (flyweights.get(key) == null) { flyweights.put(key, new FlyweightImpl()); } return flyweights.get(key); } public static int getSize() { return flyweights.size(); } }

測试代码:

public class Test {

public static void main(String[] args) { // TODO Auto-generated method stub Flyweight fly1 = FlyweightFactory.getFlyweight(“a”); fly1.action(1); Flyweight fly1 = FlyweightFactory.getFlyweight(“a”); System.out.println(fly1 == fly2); Flyweight fly3 = FlyweightFactory.getFlyweight(“b”); fly3.action(2); Flyweight fly4 = FlyweightFactory.getFlyweight(“c”); fly4.action(3); Flyweight fly5 = FlyweightFactory.getFlyweight(“d”); fly4.action(4); System.out.println(FlyweightFactory.getSize()); } }

适用性:

1.一个应用程序使用了大量的对象。

2.全然因为使用大量的对象,造成非常大的存储开销。

3.对象*大多数状态都可变为外部状态。 4.假设删除对象的外部状态,那么能够*相对较少的共享对象代替非常多组对象。 5.应用程序不依赖于对象标识。因为Flyweight对象能够被共享,对于*念上明显有别的对象。标识測试将返回真值。

能够看到前面有篇博文讲Fragment的使用,里面有好几个Fragment就是用的享元模式。另外。像线程池等也是用的享元模式。

在listview的适配器刷新为了更加流畅不必每次都new。对convertView的处理也是享元模式。

也可參考链接:http://blog.csdn.net/jason0539/article/details/22908915

二、代理模式Proxy

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

事实上这个思想非常easy,如银行的快捷支付就是一个典型的样例。购物时本来要从银行里拿钱。走银行的通道,因为你的钱本来就在银行放着。支付宝来了,说不用。我先替你垫着,然后支付宝给你出钱,过后支付宝拿着单子找银行要钱。这就是代理模式。

1.Subject 主题,是RealSubject和Proxy共同调用的接口,比方上面提到的付钱。这是约束支付宝和银行的共同接口。

public interface Object { void action(); }

2.RealSubject 定义Proxy所代表的实体。这里就像“银行通道”。

public class ObjectImpl implements Object {

public void action() { System.out.println(“========”); System.out.println(“========”); System.out.pr*ntln(“这是被代理的类”); System.out.println(“========”); System.out.println(“========”); } }

3.Proxy代理。相应上面的支付宝

public class ProxyObject implements Object {

Object obj; public ProxyObject() { System.out.println(“这是代理类”); obj = new ObjectImpl(); } public void action() { System.out.println(“代理開始”); obj.action(); System.out.println(“代理结束”); } }

測试代码:

public class Test {

public static void main() { Object obj = new ProxyObject(); obj.action(); } }

从上面能够看到,代理模式和适配器模式非常之像。都是在一个类里维持了还有一个类的抽象接口,然后实例化这个接口去做一些操作。

但代理模式跟适配器模式最大的差别是:代理类和被代理的对象类实现了共同的接口。如同支付宝和银行都提供取钱这个共同的操作。

但,适配器模式不同。适配器类和要适配的类相应的接口是不一样的。这本身就是适配的目的所在,将原有类的一个接口适配成另外一个接口供外围调用。举个样例,我要想送礼,买了一个2万的奢侈品,这个接口是“买东西”。然后我把东西给某高官送过去了,高官当然不会要嘛,就拿着东西去商场退货。这个接口是“退货”。

最后嘛,钱就到高官手里了。这就是适配器模式,“买东西”和“退货”属于两个不同的接口。

至于外观模式,举个样例,要打造一部手机,须要生产、研发、销售三大环节。每个环节都有大量的步骤,比方生产得採购原材料吧,採购时是不是先紧着亲戚的厂来点回扣吧,东西买回来要组装生产,扣点生产线上小娄娄的钱。偷个工减点料,一倒手又是银子吧!但给大领导汇报你这么整仅仅有找死,于是将大量步骤封装再封装,对大老板说这个生产嘛。

。研发嘛。。

。销售嘛,三个接口。这就是外观模式。

至此5种创建型模式、7种结构型模式已交代完成,明天開始11种行为型模式。

代理模式亦可參考链接:链接1 链接2

版权声明:本文博客原创文章。博客,未经同意,不得转载。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117529.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月4,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈JAVA设计模式之——享元模式(Flyweight)
文末有福利!!!!! 一、概述 运用共享技术有效地支持大量细粒度的对象。 二、适用性 当都具备下列情况时,使用Flyweight模式: 一个应用程序使用了大量的对象。 完全由于使用大量的对象,造成很大的存储开销。 对象的大多数状态都可变为外部状态。 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。 三、参与者 Flyweight 描述一个接口,通过这个接口flyweight
冰河
2020/10/29
4020
浅谈JAVA设计模式之——享元模式(Flyweight)
用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式
责任链模式 一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止 使用场景 1)有多个对象可以处理同一个
六月的雨
2018/05/14
5980
设计模式---享元模式
面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式通过共享技术实现相同或相似对象的重用提高系统资源的利用率。
大忽悠爱学习
2021/11/15
2490
常见的23种设计模式和七大设计模式原则,一篇文章就搞定了!
在软件开发中,设计模式是一种经过验证的解决方案,它可以帮助开发人员更好地组织和编写代码。设计模式不仅可以提高代码的可读性和可维护性,还可以加速软件开发的进程。
网络技术联盟站
2023/06/03
2.9K0
【设计模式】学习笔记(三)——结构型设计模式
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。
鸡先生
2022/10/29
7490
【设计模式】学习笔记(三)——结构型设计模式
JAVA 设计模式 享元模式
本文介绍了JAVA设计模式中的享元模式,阐述了其定义、原理、结构、实现和示例。
静默虚空
2018/01/05
6690
JAVA 设计模式 享元模式
设计模式学习笔记之享元模式
这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。
海加尔金鹰
2020/06/09
4350
设计模式专题(二十二) ——享元模式
设计模式专题(二十二)——享元模式 (原创内容,转载请注明来源,谢谢) 一、概述 享元模式(Flyweight)是运用共享技术,有效地支持大量细粒度的对象。享元模式是通过将类的实例化进行共享,实现多个类的共用,如果某些类已经实例化,不需要再次实例化。 享元模式的数据分为内部状态和外部状态,内部状态不会随不同需求的变化而变化,外部状态根据不同的需求会有所不同。例如两个博客,共享底层的基础架构代码,但是其个性化部分、用户数据部分有所不同。 享元模式的优势: 享元模式可以避免大量细粒度的开销,把要开销的部分
用户1327360
2018/03/07
6820
设计模式专题(二十二) ——享元模式
OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
前言   前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式、单例模式、原型模式。接下来我将分享的是结构型模式! 一、适配器模式 1.1、适配器模式概述   适配器模式(Adapter)属于结构型设计模式,它的作用如同它的名字一样,用于转换接口。像我们的手机、电脑的电源适配器一样,适配器模式可以使彼此不兼容的代码间优雅地协作。   适配器模式将某个类的接口转换成客户端(用户)期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配
用户1195962
2018/01/18
8910
OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
享元模式
享元模式核心掌握的一点就是——共享。如果一个程序代码中存在大量细粒度的对象,而这些大量的对象造成了很大的存储开销时就应该考虑使用。例如一个博客网站,每个人根据自己的账号登录自己的博客,此时每个“博客类”就应该成为共享,这也称为内部状态,但每个人博客里的数据又不同,这时用不同的账号区分也即是称为外部状态。 image.png UML类图如图所示。我们将具体的享元类抽象成一个接口。 1 package day_12_flyweight; 2 3 /** 4 * 享元类接口 5 * @autho
用户1148394
2018/01/09
5900
享元模式
设计模式-享元模式
享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。 1.优点 相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。 2.缺点 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。 读取享元模式的外部状态会使得运行时间稍微变长。 3.代码示例 3.1 抽象享元角色 public interface Fly
cwl_java
2019/10/26
2460
设计模式--享元模式
享元模式是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。在享元模式中,相似对象被视为可以共享的对象,并由一个工厂对象统一管理。
软件架构师Michael
2023/07/10
2230
快速梳理23种常用的设计模式(下篇)
本文旨在快速梳理常用的设计模式,了解每个模式主要针对的是哪些情况以及其基础特征,每个模式前都有列举出一个或多个可以深入阅读的参考网页,以供读者详细了解其实现。
Rude3Knife的公众号
2019/08/07
4560
快速梳理23种常用的设计模式(下篇)
设计模式-享元模式
享元模式从字面上翻译是“蝇量级模式”,其实并不太好理解。这个模式的作用就是在一个系统当中有很多很多的对象,而这些对象很相似,有细微地方不同,单数数量太大,影响系统性能,为了避免系统中出现大量相同或相似的对象,同时又不影响客户端程序通过面向对象的方式对这些对象进行操作,享元模式横空出世。
breezedancer
2018/09/12
3270
设计模式-享元模式
JAVA设计模式11:享元模式,避免创建大量相似对象的开销
享元模式是一种结构型设计模式,旨在通过共享对象来最大限度地减少内存使用和创建相似对象的开销。它适用于存在大量相似或相同对象的情况,通过共享这些对象的内部状态,可以减少内存的消耗。
Designer 小郑
2023/10/17
7280
JAVA设计模式11:享元模式,避免创建大量相似对象的开销
java设计模式(5)-适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题
爱敲代码的猫
2019/10/17
5230
Java设计模式简介(二):结构型模式
我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图:
全栈程序员站长
2021/04/09
3810
Java设计模式简介(二):结构型模式
小谈设计模式(27)—享元模式
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
学编程的小程
2023/10/19
2080
小谈设计模式(27)—享元模式
设计模式~享元模式
享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External)。
Vincent-yuan
2020/08/25
2940
设计模式~享元模式
【地铁上的设计模式】--结构型模式:享元模式
享元模式是一种结构型设计模式,旨在通过尽可能多地共享内部状态来最大化共享对象的数量,从而减少系统中对象的数量。这种模式适用于需要创建大量细粒度对象的情况,并且它可以大幅降低内存使用和对象创建的开销。 在享元模式中,对象可以分为两类:内部状态和外部状态。内部状态是可以共享的,通常保存在享元对象内部,并且不会随着时间的推移而改变。而外部状态则是不可共享的,它通常取决于具体场景,并在运行时传递给享元对象。 这种模式的主要思想是在内存中维护一个对象池,用于存储共享的对象。当需要创建对象时,首先从对象池中查找是否已经有该对象的实例存在。如果已经存在,则返回现有实例,否则创建一个新的实例并将其添加到对象池中以供未来使用。 优点包括节省内存,提高性能和可维护性。缺点则是需要对系统进行深入分析和设计,以确定内部状态和外部状态,因此可能会增加系统的复杂性。 享元模式通常和其他设计模式一起使用,例如工厂模式和单例模式,以进一步优化系统性能和可维护性。
喵叔
2023/05/03
1890
相关推荐
浅谈JAVA设计模式之——享元模式(Flyweight)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档