设计模式-装饰器模式

设计模式-装饰器模式
1、定义 :
在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。
2、优点:
装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态的给一个对象扩展功能,即插即用;
通过使用不同装饰类以及这些装饰类的排列组合,可实现不同效果;
装饰器完全遵守开闭原则。
3、缺点:
会出现更多的代码,更多的类,增加程序复杂性;
动态装饰时,多层装饰时会更复杂。
4、适用场景:
用于扩展一个类的功能或给一个类添加附加职责;
动态的给一个对象添加功能,这些功能可以再动态的撤销。
5、类图:
在这里插入图片描述
6、装饰器模式中的角色:

  • 抽象构建角色(Component):Component是一个抽象类或接口,是要包装的原始对象。
  • 具体构建角色(BaseComponent):是Component的实现类,最终要装饰的实际对象。
  • 装饰器角色(Decorator):是一个抽象类,继承或实现了Component的接口,同事它持有一个对Component实例对象的引用,也可以有自己的方法。
  • 具体装饰角色(ConcreteDecorator):是Decorator的实现类,是具体的装饰器对象,负责给BaseComponent附加责任。

7、代码示例:(动态设置监控考勤设备的例子,本例子纯属虚构)
监控考勤设备的方式如下:

  • 监控考勤设备是否正常工作(基本)
  • 监控考勤设备考勤数量是否正常(假如工作日平局每天考勤人数大约在100人,如果某天考勤人数小于50人,考勤机可能存在异常)
  • 动态设备考勤机异常人数,监控考勤设备考勤数量是否正常(如果公司大批量招人,考勤人数异常为小于100人时)
/**
 * 监控考勤设备的抽象方法
 */
public abstract class MonitorEquipment {
    protected abstract String monitor();
}
/**
 *  最基本的方法:监控设备是否正常运行,继承MonitorEquipment,并重写监控方法
 */
public class BaseMonitor extends MonitorEquipment {
    @Override
    protected String monitor() {
        return " 监控考勤设备是否正常工作(基本)";
    }
}
/**
 * 装饰器角色:构造参数传入MonitorEquipment
 */
public class Decorator extends MonitorEquipment {
    private MonitorEquipment monitorEquipment;

    public Decorator(MonitorEquipment monitorEquipment) {
        this.monitorEquipment = monitorEquipment;
    }

    @Override
    protected String monitor() {
        return monitorEquipment.monitor();
    }
}
/**
 * 具体装饰角色A:在原有功能基础上添加监控考勤人数是否正常
 */
public class MonitorA extends Decorator {
    public MonitorA(MonitorEquipment monitorEquipment) {
        super(monitorEquipment);
    }

    protected String monitor() {
        return super.monitor() + "-----监控考勤人数是否正常";
    }
}
/**
 * 装饰角色B:添加设置最小监控异常人数为100人
 */
public class MonitorB extends Decorator {
    public MonitorB(MonitorEquipment monitorEquipment) {
        super(monitorEquipment);
    }

    protected String monitor() {
        return super.monitor() + "----------设置最小监控异常人数为100人";
    }
}
/**
 * 测试类
 */
public class ClientTest {
    public static void main(String[] args) {
        MonitorEquipment monitorEquipment;

        System.out.println("---------监控设备是否正常工作-----------");
        monitorEquipment = new BaseMonitor();
        System.out.println(monitorEquipment.monitor());

        System.out.println("---------添加监控考勤人数是否异常-----------");
        monitorEquipment = new MonitorA(monitorEquipment);
        System.out.println(monitorEquipment.monitor());

        System.out.println("---------设置最小监控异常人数-----------");
        monitorEquipment = new MonitorB(monitorEquipment);
        System.out.println(monitorEquipment.monitor());
    }
}

测试结果

---------监控设备是否正常工作-----------
 监控考勤设备是否正常工作(基本)
---------添加监控考勤人数是否异常-----------
 监控考勤设备是否正常工作(基本)-----监控考勤人数是否正常
---------设置最小监控异常人数-----------
 监控考勤设备是否正常工作(基本)-----监控考勤人数是否正常----------设置最小监控异常人数为100人
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值