java设计模式之装饰模式

装饰模式是一种结构型模式,这种模式创建了一个装饰类,用来包装原有的类,在原有类的方法签名不变的情况下,增加额外的功能。
举个例子,

BufferedReader br=new BufferedReader(new InputStreamReader(new FileinputStream(file)));

InputStreamReader本身有read()方法可以读取单个字符,这样在有的场景下不是很方便,比如我就是想每次读取一行怎么办。

这个时候就出现了一个增强版的BufferedReader,将InputStreamReader这个转换流作为参数传进来,就可以使用readLine()方法了,同时,new InputStreamReader这个对象的功能没有任何影响。注意:BufferedReader和InputStreamReader同时实现了java.io.Reader接口

继承不是也能够实现这个功能吗,为什么不用继承?

继承的缺点
1)单继承
2)对于已经存在的父类对象,无法使之调用子类方法
3)对于子类对象而言,无法调用父类对象

利用一个统一的父类或者接口,将一个子类对象作为参数来构造另一个子类对象,对其中的方法做改变或者增强—装饰模式

如何实现呢,其实在第一个例子中就可以看出来了,写一个增强类,和原类同时继承一个接口,然后将接口作为增强类的参数传入。

定义一个员工接口,定义一个小组长类和经理类,将搬砖小组长包装成经理,经理构造方法添加接口作为参数:

public class DecorateDemo2 {
    public static void main(String[] args) {
        TeamLeader t1=new TeamLeader();
        t1.work();
        Manager m=new Manager(t1);
        m.work();
    }
}
interface Staff{
    void eat();
    void work();
}

class Manager implements Staff{
    public Manager(Staff f){

    }
    @Override
    public void eat() {
        System.out.println("在天上人间吃饭");
    }

    @Override
    public void work() {
        System.out.println("经理在处理文件");
    }

}

class TeamLeader implements Staff{

    @Override
    public void eat() {
        System.out.println("在公司食堂吃饭");
    }

    @Override
    public void work() {
        System.out.println("小组长在搬砖");
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值