装饰模式(旧恋)「建议收藏」

装饰模式(旧恋)

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

|–什么是装饰模式。

装饰模式:是你还是你,一切拜托你(借用老崔经典词)。

它是由继承出现的。先有继承,再有装饰。

回顾继承

    优点:提高复用性,让能够反复使用。通过方法重写利用后期扩展。

    坏处:因为类与类之间的继承关系。但他们关系增强。耦性也就高了。不符合java宗旨:低耦合。高内聚。

对照方下:

a:
有一个Witer体系


|–TxtWrite


|–Mp3Write


|–DIDWrite

上面是一个普通子类实现。调用者认为运行太慢,要求对三者进行增强(高效|缓冲)。改动例如以下

class myBuffereWrite exetends Write{
//接收子类:Fu f = new Zi();
private Write ziWrite;


public BuffereWrite(Write ziWrite)
{
this.ziWrite = ziWrite;
}
public void writeLine(String line)
{
//使用ziWrite进行整容处理。然后一行数据保存到write中。
}
public void close()
{
ziWrite.clese();//多态(调用的还是子类)!
}
public void flash(){
ziWrite.flash();//多态(调用的还是子类)。
}
....//重写Write的抽象方法。调用的myBuffereWrite中的,再方法里边调用是传送ziWrite。

仅仅只是在调用它之前给它做了一些手术。

}

|–总结

   1:比方你使用Write的高效功能,那你就创建myBuffereWrite,传递你的对其高效的对象,比方FileWrite();

   2:装饰模式体现了对一个对象(功能)的增强(高内聚),然后紧密性比較弱(低耦合)。

   3:JDK中用的装饰就挺多的,比方BufferedWriter(Writer out);PrintStream(OutputStream out);ObjectInputStream(InputStream in)等。

|–代码演示样例

  模拟BuffereReader装饰类

package com.Decoration;

import java.io.IOException;
import java.io.Reader;

/**
 * @author hubiao
 * 模拟BuffereReader装饰类
 *	
 *	分析:模拟一个类,就是自定一个类。实现它的特有方法:ReadLine();
 * 	  1:模拟什么:特有方法
 *        2:你有什么:依据装饰特点。自定的类继承一个抽象类,由于BuffereReader的readLine底层也是继承Reader中的。

* 我们要做的。也是继承Reader,写一个与BuffereReader一样的ReadLine方法来。 */public class MyBuffere extends Reader { /*Reader是一个抽象类的父类。将须要高效的类都实现了它。

都是它的子类。

*/ private Reader reader = null; public MyBuffere(Reader reader){ this.reader = reader; } public int read(char[] cbuf, int off, int len) throws IOException { return reader.read(cbuf, off, len); } public String readLine() throws IOException { /** * 1:这里要思考,使用 * A:read(char[] cbuf, int off, int len);一次读取一缓冲区 * B:read();//一次读取一个字符串 * 2:分析 * 我们模拟readLine目的是为了模拟什么?还不是为了实现BufferedReader中的readerLine一次读取一行的高效方法。 * 然后使用A方法不合适,由于它一次读取一个char容量定义的长度,我们封装好的代码非常难获知调用者要读取的数据文本的每行数据有多长。

* 使用B方法的优点,是一次读取一个字符,当遇到\r\n就说明是一行的结束。则说一行读取完成,那怎么一行的数据每一个字符用什么保存呢? * 使用String, 这...太可怕了吧。由于我们知道String在java中是一个常量池。

一但赋值,将不可变。

所以选择效率高的StringBuilder * 把每一个字符拼接到StringBuffer中。再返回给调用者。 */ //单字符容器 StringBuffer buffer = new StringBuffer(); //每一个字符 int read = 0; while((read = reader.read())!=-1) { char chr = (char) read; if(chr=='\r') continue; if(chr=='\n') return buffer.toString(); else buffer.append(chr); } //防止读取的是最后一行。则没有\r\n。那么再推断缓冲区中是否有值?假设有,则再返回。 if(buffer.length() > 0 ) return buffer.toString(); else return null; } public void close() throws IOException { reader.close(); }}


  模拟LineNumberReader

/**
 * @author hubiao
 *	模拟LineNumberReader
 *		也是相同,模拟,就是自定一个类,模拟需求给出的特殊方法:获取每一个行号,然后读取每一行。
 */
public class MyLineNumberReader extends Reader{

	/*接收传递子类对象,Fu f = new Zi();//多态*/
	private Reader reader;
	
	private int lineNumber;//行号
	
	public MyLineNumberReader(Reader reader) {
		this.reader = reader;
	}

	public int read(char[] cbuf, int off, int len) throws IOException {
		return reader.read(cbuf, off, len);
	}
	
	public String readLine() throws IOException
	{
		//单字符容器
		StringBuffer buffer = new StringBuffer();
		
		//每一个字符
		int read = 0;
		while((read = reader.read())!=-1)//-1表示读取到流的结尾!
		{
			char chr = (char) read;
			if(chr=='\r')
				continue;
			if(chr=='\n'){
				lineNumber++;
				return buffer.toString();
			}
			else
				buffer.append(chr);
		}
		
		//防止读取的是最后一行,则没有\r\n。那么再推断缓冲区中是否有值?假设有,则再返回。

if(buffer.length() > 0 ){ lineNumber++; return buffer.toString(); }else return null; } public void close() throws IOException { reader.close(); } public int getLineNumber() { return lineNumber; } public void setLineNumber(int lineNumber) { this.lineNumber = lineNumber; }}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年2月5日 上午6:00
下一篇 2022年2月5日 上午6:00


相关推荐

  • 科大讯飞再发力!全新星火X1升级版将于7月重磅上线!

    科大讯飞再发力!全新星火X1升级版将于7月重磅上线!

    2026年3月14日
    2
  • 人工智能大作业—-八数码问题

    人工智能大作业—-八数码问题基于搜索策略的八数码问题求解大作业题目:基于搜索策略的八数码问题求解大作业目的:加深对搜索策略的理解,尤其是对启发式搜索的基本原理的理解,使学生能够通过编程实现图搜索的基本方法和启发式搜索算法,并能够解决一些应用问题。大作业要求:使用盲目搜索中的宽度优先搜索算法或者使用启发式搜索中的全局择优搜索或A*算法。每人提交一份大作业报告,该报告包括设计、实现、测试、实验对比结…

    2022年7月12日
    45
  • VLDB论文解读:阿里云超大规模实时分析型数据库AnalyticDB「建议收藏」

    VLDB论文解读:阿里云超大规模实时分析型数据库AnalyticDB「建议收藏」1、背景随着数据量的快速增长,越来越多的企业迎来业务数据化时代,数据成为了最重要的生产资料和业务升级依据。伴随着业务对海量数据实时分析的需求越来越多,数据分析技术这两年也迎来了一些新的挑战和变革:在线化和高可用、离线和在线的边界越来越模糊,一切数据皆服务化、一切分析皆在线化; 高并发低延时,越来越多的数据系统直接服务终端客户,对系统的并发和处理延时提出了新的交互性挑战; 混合负载,一套实时分析系统既要支持数据加工处理,又要支持高并发低延时的交互式查询; 融合分析,随着对数据新的使用方式探索,需

    2025年12月12日
    3
  • tplink迷你路由器中继模式_TP-link mini(迷你)无线路由器设置(Repeater模式)

    tplink迷你路由器中继模式_TP-link mini(迷你)无线路由器设置(Repeater模式)本文的设置方法适用于 TP Linkmini 系列路由器中的 TL WR700N TL WR702N TL WR706N TL WR710N TL WR800N 型号 本文将以 TL WR700N 为例来介绍详细 Repeater 模式的设置方法 注意 TL WR706N 新增加了一个硬件开关 在设置之前需要先把硬件拨动到 AP 模式 其余的设置和本文介绍的设置方法完全相同 Repeater 模式能够对原来的无线信号进行

    2026年3月19日
    4
  • ider 2022激活码(JetBrains全家桶)「建议收藏」

    (ider 2022激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月2日
    914
  • sqlserver临时表详解_怎么把临时表的数据更新到正式表

    sqlserver临时表详解_怎么把临时表的数据更新到正式表[转自]http://zhengweisincere.blog.163.com/blog/static/498446492009625749522/在SQLServer的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择。记得在给一家国内首屈一指的海运公司作SQLServer应用性能评估和调优的时候就看到过

    2022年8月21日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号