A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

崇尚至简

中级黑马

  • 黑马币:113

  • 帖子:30

  • 精华:0

© 崇尚至简 中级黑马   /  2018-8-24 13:02  /  1577 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

需求:有一个Animal接口,提供了抽象方法eat(),有一个猫类实现了Animal接口,重写了eat方法
class Animal {
    public void eat();
}
class Cat implements Animal{
    @Override
    public void eat() {
        System.out.println("吃老鼠");
    }
}
要求对Cat类中eat方法进行增强(吃老鼠之前抓老鼠)
新建一个类SuperCat实现Animal接口,将animal作为其一个成员属性,对eat方法进行重写
public class SuperCat implements Animal {
    Animal animal;
    public SuperCat(Animal animal) {
        this.animal = animal;
    }
    @Override
    public void eat() {
        System.out.println("抓老鼠");
        animal.eat();
    }
}
//测试
public class Test {
    public static void main(String[] args) {
        handleMouse(new SuperCat(new Cat()));
    }
    public static handleMouse(Animal animal) {
        animal.eat();
    }
}
运行程序:
抓老鼠
吃老鼠
这种方法要求装饰类与被装饰类要实现同一个接口,如果接口的方法比较多,而只需要对其中一个方法进行增强,则接口中的其他方法需要提供空实现,常用的一个解决方案是定义一个类实现该接口,并提供所有方法的空实现,装饰类若要增强其中一个方法只需继承这个空实现类,并重写相应的方法,如可以对上面解决方案进行改写
//定义一个Animal的空实现类
public class AnimalWrapper implement Animal{
    Animal animal;
    public AnimalWrapper(Animal animal) {
        this.animal = animal;
    }
    public void eat() {
    }
}
//定义SuperCat类
public class extends AnimalWrapper{
    public AnimalWrapper(Animal animal) {
        super(animal);
    }
    public void eat() {
        System.out.println("抓老鼠");
        animal.eat():
    }
}
经典应用场景:web开发中,需要对HttpServletRequest的getParameter(String args)方法进行增强(处理get方式乱码),HttpServletRequest提供了一个HttpServletRequestWrapper类,我们可以继承这个空实现类对getParameter(String args)进行增强
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

8 个回复

倒序浏览
大神总结的
回复 使用道具 举报
希望跟你一样都那么牛
回复 使用道具 举报
真的是大神,这种题目总结的真好
回复 使用道具 举报
大神,交个朋友吧。希望像你一样那么牛
回复 使用道具 举报
做程序员的就是用代码来写感言的吗~
回复 使用道具 举报
抓老鼠,吃老鼠都能用代码思想
回复 使用道具 举报
技术一定6666666
回复 使用道具 举报
大神啊,真的好棒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马