文档章节

装饰者模式

CurtainRight
 CurtainRight
发布于 2016/04/18 11:10
字数 632
阅读 15
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

定义:

动态地将这人附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。


1、接口

public interface ClassInter {
	void handle();
}

2、直接继承这个类,全部重写该方法

public class ClassB implements ClassInter{
	@Override
	public void handle() {
		System.out.println("handleA");
		System.out.println("记录");
	}
}

3、直接重写这个类,继续调用源接口的方法,再添加扩展方法,然后在继承的方法中直接调用。

public class ClassA implements ClassInter{
	@Override
	public void handle() {
		System.out.println("handleA");
	}
}
public class ClassA1 extends ClassA{
	@Override
	public void handle() {
		//不紧需要handle
		super.handle();
		//而且需要记录用户
		System.out.println("记录");
	}
}

4、运行结果

handleA
记录

解释(对于初学者,你可能感觉ClassB更加方便???):

1、当团队开发的时候,不要去在别人的代码上去动手脚,去扩展你的功能。这样如果出现问题,就会争吵

2、当用Maven对于版本的控制的时候,旧版本中没有新加功能(也没用那些数据表),那么升级版本(如果表结构没有升级),那么你的代码就是BUG了。

    比如:I8用的是老的微信后台,现在微信管家加上了数据分析,由于你的用户关注和取消关注用的是同一个Handler,那么对于I8来说,不加上对应的表结构,就会报错。(同时别人I8根本不需要你的这些功能)

3、也许有人会问你这样,怎样在代码中,去控制同一个代码调用不同的接口呢???

    其实很简单,大家都用过,只不过真正要写的时候忘记了。那么就是接口配置调用(就是把有差异的部分直接写在配置中)


真正的装饰者(Java中的文件系统)

1、与上面区别:其实很容易看出来,面向接口编程

2、代码

public class ClassFile extends FilterInputStream {

	protected ClassFile(InputStream in) {
		super(in);//扩展FilterInputStream
	}

	@Override
	public int read(byte[] b) throws IOException {
		int c = super.read();
		return (c == -1 ?c : Character.toLowerCase((char)c));
	}

	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		int result = super.read(b, off, len);
		for(int i = off ; i <off + result ; i++){
			b[i] = (byte)Character.toLowerCase((char)b[i]);
		}
		return result;
	}
}
public static void main(String[] args) {
		int c;
		InputStream in;
		try {
			//这里的InputStream先有FileInputStream装饰,
			//再由BufferedInputStream装饰,
			//最后由ClassFile装饰
			in = new ClassFile(
					new BufferedInputStream(
							new FileInputStream("test.txt")));

		while ((c = in.read()) >= 0) {
			System.out.println((char)c);
		}
		in.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

© 著作权归作者所有

上一篇: 外观模式
CurtainRight
粉丝 6
博文 172
码字总数 61177
作品 0
武汉
程序员
私信 提问

暂无文章

006-ELK的二进制安装

二进制安装ELKstack 本次搭建属于单点,在同一台机器上进行安装 基础组件部署 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yu...

伟大源于勇敢的开始
4分钟前
1
0
OSChina 周四乱弹 —— 浙江台的电话号码倒是记得挺牢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Out On The Streets》 一直不理解北欧人对重金属和死亡摇滚的热情,听完这首歌好像理解了。#今日歌曲推荐# 《Out On The Stre...

小小编辑
今天
6
0
Leetcode PHP题解--D121 21. Merge Two Sorted Lists

D121 21. Merge Two Sorted Lists 题目链接 21. Merge Two Sorted Lists 题目分析 合并两个有序链表。 思路 逐个遍历两个链表,把小的数字塞入数组里。之后再拼起来。 最终代码 <?php/** *...

skys215
今天
5
0
mars-config 动态配置管理

mars-config 码云地址:https://gitee.com/fashionbrot/mars-config 介绍 spring mvc 、springboot 动态配置系统。http 轮训方式 更新 动态配置 软件架构 软件架构说明 后端使用技术 :sprin...

fashionbrot
今天
14
0
女朋友玩吃鸡手游被开挂老哥骗炮,我见义勇为将骗子绳之以法

大家好,我是乔哥。 晚上10点以后下班后我回到自如出租房里面,开始处理公众号粉丝发来的消息,一条一条处理,突然看到了这么几条消息,吸引了我的眼球: 然后我就和这位女粉丝小红(化名)聊...

gzc426
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部