装饰者模式——decorator

作用和应用场景:装饰者给被装饰者增加功能,实现功能扩展。如:

OutputStream out = null;
		try {
			out = new BufferedOutputStream(new FileOutputStream(new File("D://aa.txt")));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

文件i/o读写是jdk使用装饰者模式经典案例,FileOutputStream已经实现了write文件的功能相当于被装饰者,BufferedOutputStream相当于装饰者,BufferedOutputStream给FileOutputStream增加了byte缓冲功能。用来提高i/o效率。
装饰者模式实现细则:1、装饰者和被装饰者实现同一个接口
2、装饰者的构造器以被装饰者为参数。
下面是装饰者模式的基本实现demo:
接口:

package designModel.decorator;

import java.util.List;

public interface Dao {
	int insert();
	List<Object> queryForList();
}

功能实现者(被装饰者):

package designModel.decorator;

import java.util.List;

public class UserDao implements Dao{

	@Override
	public int insert() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<Object> queryForList() {
		// TODO Auto-generated method stub
		return null;
	}

}

装饰者:

package designModel.decorator;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;

public class DecorateDao implements Dao{
	private UserDao user;
	public DecorateDao(UserDao user) {
		this.user = user;
	}
	@Override
	public int insert() {
		beforeInsert();//在新增操作前处理的业务
		int insertNum = user.insert();
		AfterInsert();//在新增操作之前处理的业务
		return insertNum;
	}

	@Override
	public List<Object> queryForList() {
		beforeQuery();//在query之前的业务
		List<Object> list = user.queryForList();
		AfterQuery();//在query之后的业务
		return list;
	}
	public void beforeInsert() {
		System.out.println("在 before insert 时 do something");
	}
	public void AfterInsert() {
		System.out.println("在 After insert 时 do something");
	}
	public void beforeQuery() {
		System.out.println("在 before Query 时 do something");
	}
	public void AfterQuery() {
		System.out.println("在 After Query 时 do something");
	}
}

注释:此例子主要实现在新增和查询前后进行记录日志。

猜你喜欢

转载自blog.csdn.net/shidebin/article/details/83090227
今日推荐