/** * 装饰者设计模式 * 概述:值指在不改变原类,不使用继承的基础上,动态的扩展一个对象 * 实现步骤: * 1,装饰者类和被装饰者类必须实现相同的接口 * 2,在装饰类中必须传入被装饰者的引用 * 3,在装饰者类中需要对被装饰者【需要扩展的方法】进行扩展 * 4,在装饰者类中对不需要扩展的方法,调用被装饰者中同名的方法 */
案例:
/** * 需求: * 在不改变SqlCaoZuo这个类,也不使用继承的清空下 * 对myDel删除操作进行增强,记录谁删除了数据 * 其他方法不增强 */
/** * 创建一个sql操作的接口 * 被装饰者和装饰者类都需要实现这个接口 */
public interface MySqlInterface {
void myInsert();
void myDel();
void myUpdate();
void mySelect();
}
被装饰者类
/**
* 被装饰者类
* 需要实现接口
*/
public class SqlCaoZuo implements MySqlInterface{
@Override
public void myInsert() {
System.out.println("被装饰者增加数据操作");
}
@Override
public void myDel() {
System.out.println("被装饰者删除数据操作");
}
@Override
public void myUpdate() {
System.out.println("被装饰者更新数据操作");
}
@Override
public void mySelect() {
System.out.println("被装饰者查询数据操作");
}
}
装饰者类
/**
* 装饰者类也需要继承接口
*/
public class SqlCaoZuoPlus implements MySqlInterface{
/**
* 装饰者类需要传入被装饰者类的引用对象
*/
private SqlCaoZuo sqlCaoZuo;
public SqlCaoZuoPlus(){}
public SqlCaoZuoPlus(SqlCaoZuo sqlCaoZuo) {
this.sqlCaoZuo = sqlCaoZuo;
}
@Override
public void myInsert() {
this.sqlCaoZuo.myInsert();
}
@Override
public void myDel() {
//我们的需求是增强删除操作,记录日志
//模拟记录日志
System.out.println("增强:记录删除操作的日志");
this.sqlCaoZuo.myDel();
}
@Override
public void myUpdate() {
this.sqlCaoZuo.myUpdate();
}
@Override
public void mySelect() {
this.sqlCaoZuo.mySelect();
}
}
main方法
public class Test {
public static void main(String[] args) {
/**
* 装饰者设计模式
* 概述:值指在不改变原类,不使用继承的基础上,动态的扩展一个对象
* 实现步骤:
* 1,装饰者类和被装饰者类必须实现相同的接口
* 2,在装饰类中必须传入被装饰者的引用
* 3,在装饰者类中需要对被装饰者【需要扩展的方法】进行扩展
* 4,在装饰者类中对不需要扩展的方法,调用被装饰者中同名的方法
*/
/**
* 需求:
* 在不改变SqlCaoZuo这个类,也不使用继承的清空下
* 对myDel删除操作进行增强,记录谁删除了数据
* 其他方法不增强
*/
SqlCaoZuoPlus sqlCaoZuoPlus = new SqlCaoZuoPlus(new SqlCaoZuo());
sqlCaoZuoPlus.myInsert();
sqlCaoZuoPlus.myDel();
sqlCaoZuoPlus.myUpdate();
sqlCaoZuoPlus.mySelect();
}
}