装饰者模式 java实现

/**
 * 装饰者设计模式
 * 概述:值指在不改变原类,不使用继承的基础上,动态的扩展一个对象
 * 实现步骤:
 * 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值