JAVA设计模式之装饰器模式

装饰模式是一种设计模式,它允许在运行时给对象添加新的职责,而不必通过继承来实现。Java IO中的BufferedReader和BufferedWriter是经典例子。在代码示例中,CommonWork作为基础工作,DoctorWork、PoliceWorker和TeacherWork通过装饰模式增加了各自独特的工作职责,展示了其灵活性和开闭原则的应用。
摘要由CSDN通过智能技术生成

1.概念:

  以对客户透明的方式来扩展对象的功能,用户根据功能需求随意选取组成对象的成分进行动态地将责任附加到对象上,通过方法的链式调用来实现
装饰者提供了比继承更有弹性的替代方案, 简单来讲就是动态的给一个对象增加一些职能,相对与生成子类更加灵活

设计原则为:开闭原则(类应该对扩展开发,对修改关闭) 

2.应用以及说明:

1装饰模式增加强了单个对象的能力。Java IO到处都使用了装饰模式,经典的例子就是Buffered系列类如BufferedReader和BufferedWriter,它们增强了Reader和Writer对象,以实现提升性能的Buffer层次的读取和写入。
2该模式中装饰者和被装饰者都继承同一个父类,这里继承的目的是为了达到”类型匹配“,而不是获得父类的”行为“   摘自(HeadFirst设计模式)
3组合和委托可用于运行时动态地加上新的行为
4装饰者可以在被装饰者的行为前面 与/或后面加上自己的行为,甚至可以将被装饰者的行为整个取代掉,从而达到某种目的
5装饰者会导致设计中出现很多小对象,如果过度使用,会成程序变得很复杂

3. 类图

4. 代码示例

public interface Work {
    void doWork();
}
public class CommonWork implements Work {
    @Override
    public void doWork() {
        System.out.println("早安,打工人!");
    }
}

public class DoctorWork implements Work {

    private CommonWork commonWork;

    public DoctorWork(CommonWork commonWork) {
        this.commonWork = commonWork;
    }


    @Override
    public void doWork() {
        commonWork.doWork();
        System.out.println("我的工作就是救死扶伤");
    }
}

public class PoliceWorker implements Work {

    private CommonWork commonWork;
    public PoliceWorker(CommonWork commonWork) {
        this.commonWork = commonWork;
    }



    @Override
    public void doWork() {
        commonWork.doWork();
        System.out.println("我的工作就是保卫大家的安全");
    }
}

public class TeacherWork implements Work {

    private CommonWork commonWork;

    public TeacherWork(CommonWork commonWork) {
        this.commonWork = commonWork;
    }

    @Override
    public void doWork() {
        commonWork.doWork();
        System.out.println("我的工作就是培养祖国的花朵");
    }
}

public class WorkTest {

    public static void main(String[] args) {
        CommonWork commonWork = new CommonWork();
        DoctorWork doctorWork = new DoctorWork(commonWork);
        doctorWork.doWork();

        PoliceWorker policeWorker=new PoliceWorker(commonWork);
        policeWorker.doWork();

        TeacherWork teacherWork=new TeacherWork(commonWork);
        teacherWork.doWork();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值