装饰者模式

定义:java

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


一、接口微信

public interface ClassInter {
	void handle();
}

二、直接继承这个类,所有重写该方法
ide

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

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

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("记录");
	}
}

四、运行结果
code

handleA
记录

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

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

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

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

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

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


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

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

二、代码

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();
		}
	}
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息