首页 > 编程知识 正文

适配器和装饰者设计模式区别,23个设计模式列表

时间:2023-05-04 11:35:02 阅读:135301 作者:99

装饰者模式(开闭原则)-Decorator

定义:将扩展APP应用于单个对象而不更改原始对象。 JAVA I/O中装饰者模式spring session中的装饰者模式Mybatis高速缓存中的装饰者模式JAVA I/O中的装饰者模式抽象构件:Component(抽象类)----。

3358www.Sina.com/----I/o的3358www.Sina.com/

3358 www.Sina.com/----- I/o流中的3358www.Sina.com/

3358www.Sina.com/----I/o流中的InputStream/OutputStream和Reader/Writer

流名(省略inputStream )场景装饰者中的nqdmgByteArray访问数组,将存储器内的一个缓冲器用作inputStream,CPU从缓存读取数据的速度比来自存储媒体的速度快10倍以上输入流。 不推荐。 在字符转换问题上存在缺陷的具体组件文件访问文件,以一个文件为InputStream,实现对文件的读取操作的具体组件Piped访问管道。 主要用于线程,一个线程通过管道输出流并发送数据,另一个线程通过管道输入流并读取数据。 这样,用于实现两个线程之间通信的具体组件Sequence将多个InputStream合并为一个InputStream。 通过使用“序列输入流”类,APP应用程序可以连续合并多个输入流以创建特定的组件Data特殊流,并读取基本类型的数据(如byte、int和String ),从而生成Object对象列表导入对象的功能具体的组件PushBack可以将部分导入的数据返回到输入流的缓冲区,具体装饰缓冲流。 添加缓冲区功能以具体装饰LineNumber的附加功能是通过添加目标文件中的行号来具体装饰所有I/O流。 在“具体I/O流”一章中详细说明。

大致上:

1 .字节,装饰文字流。

2 .装饰具体文件格式的字节字符流。

3 .我将过滤流类作为**装饰(抽象) *装饰具体指定对象

(具体构件:ConcreteComponent(),像我这样的厨师写代码时,不会考虑直接抽象装饰。 一定要写下具体装饰巨大的情况,再考虑用抽象装饰封装一波。

4 .用缓冲流类等作为FileOutputStream和FileInputStream。装饰具体的指定对象

装饰角色:Decorator(

bufferedreaderxxx=newbufferedreader (newinputstreader ) newdeflaterinputstream (new data inputstream ) ) new文件输入//抽象地说就是可以一直给想要装饰的角色打褶,I/O流的抽象装饰存在的意义还是因为多个具体的装饰一定有FilterOutputStream过滤流类,所以Reader和BufferedReader这两个具体的装饰但是,BufferedReader字符流不具有与其他类相同的方法,或者在名为Reader的抽象类中具有相同的方法,因此不需要继承FilterReader,但BufferInputStream

有趣的是,从上面的几张图中可以看到,具体装饰:ConcreteDecorator(对象,Filter是包里私有的,即使它是普通的类,你也可以在idea上得到,但是不能用如果你不知道里面的结构原理,我完全不知道为什么会得到这个类,但是不能用。 而且,因为是Reader和inpuu,所以我认为这里IO流用的装饰者模型是不可能的。 在扩展功能时,为什么不用接口来做,为什么必须实现Filter来实现装饰者,为了今后的功能扩展,请参考BufferedOutputStream缓冲流类等

参杂的,导致功能扩展不好用接口,而用装扮者来拓展功能更合适一点,我暂时也想不到其他好的模式。

需要注意的是:是装饰者和被装饰者必须达到类型匹配,这样他们才能组合在一起,然后共同去描述和修饰某一事物。

还有一个值得注意的点:

BufferedReader初始化时,默认缓冲区大小是8192字符数组,而BufferedInputStream初始化时,默认缓冲区大小是8192字节数组,也就是一个16k,一个8k,需要分清楚。

JAVA mybatis中 二级缓存的装饰者模式

mybatis的装饰者直接放在了/ibatis/cache/decorators,(很明显)

查看它的UML图,刚开始说它是装饰者我是有点不信的,后来仔细看是把装饰者简化了

仔细看一下它的目录结构,其他的都作为装饰器放在了decorators,而PerpetualCache作为接口的实现工具类放在了impl包下。所以它作为具体构件即被装饰者,而其他都是装饰者。

mybatis对装饰者模式进行了简化但是核心仍在


也就是实现装饰者的核心一定要保证装饰者和被装饰者的类型一致,所以装饰者初始化时一定传入的时大家所共有的接口或抽象类(超类),来保证我保存上一个被装饰者的功能和传给下一个装饰者时的功能的一个完整适配。

缓存类型作用角色FifoCache先进先出算法,缓存回收策略装饰者LoggingCache输出缓存命中的日志信息装饰者LruCache最近最少使用算法,缓存回收策略装饰者ScheduledCache调度缓存,负责定时清空缓存装饰者SerializedCache缓存序列化和反序列化存储装饰者SoftCache基于软引用实现的缓存管理策略装饰者SynchronizedCache同步的缓存装饰器,用于防止多线程并发访问装饰者WeakCache基于弱引用实现的缓存管理策略装饰者TransactionalCache事务缓存 , 一次性存入或移除多个缓存装饰者PerpetualCache(一级)永久缓存 ,一旦存入就一直保持被装饰者一级缓存,又叫本地缓存,是PerpetualCache类型的永久缓存,保存在执行器中
(BaseExecutor),而执行器又在SqlSession(DefaultSqlSession)中,所以
一级缓存的生命周期与SqlSession是相同的。二级缓存,又叫自定义缓存,实现了Cache接口的类都可以作为二级缓存,所以可配置如encache等的第三方缓存。二级缓存以namespace名称空间为其唯一标识,被保存在Configuration核心配置对象中 总结: 优点: 1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。 2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合 缺点: 1.这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。