Decorator Wrapper 装饰模式 包装


简介
 
       
 
       
装饰模式
   装饰模式以对客户端【透明】的方式【扩展】对象的功能,客户端并不会觉得对象在装饰前和装饰后有什么不同,是 继承关系的一个替代方案。
   若只为增加功能而使用继承,当基类较多时会导致继承体系越来越臃肿, 装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。
   装饰对象和真实对象有相同的接口,这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
  装饰对象包含一个真实对象的引用 ,它接收所有来自客户端的请求,并把这些请求转发给真实的对象,并 在转发这些请求之前或之后 可以 附加一些功能。
角色
  • 抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构件角色(Concrete Component):定义将要接收附加责任的类。
  • 装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口。
  • 具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。
优点
  • 解决【类膨胀】【类爆炸】【继承体系臃肿】的问题
  • 扩展性非常好
  • 比继承更灵活

演示
 
      
 
      
public interface IWork {
    public void work();
}

public class People implements IWork {
    @Override
    public void work() {
        System.out.println("人开始干活.....................");
    }
}
class PeopleV2 extends People {
    //【重写】父类的方法
    @Override
    public void work() {
        System.out.println("先检查零件是否正常");//增强的功能
        super.work();
    }
}
class PeopleV3 extends People {
    @Override
    public void work() {
        super.work();
        System.out.println("干完活收拾下房间");//增强的功能
    }
}

public class Robot implements IWork {
    @Override
    public void work() {
        System.out.println("Robot开始干活.....................");
    }
}
class RobotV2 extends Robot {
    //【重写】父类的方法
    @Override
    public void work() {
        System.out.println("先检查零件是否正常");//增强的功能
        super.work();
    }
}
class RobotV3 extends Robot {
    @Override
    public void work() {
        super.work();
        System.out.println("干完活收拾下房间");//增强的功能
    }
}

/**
 * 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
 */
public class Decorator implements IWork {
    private IWork work;
    public Decorator(IWork work) {
        this.work = work;
    }
    @Override
    public void work() {
        System.out.println("先检查零件是否正常");//增强的功能
        work.work();
    }
}
class DecoratorV2 implements IWork {
    private IWork work;
    public DecoratorV2(IWork work) {
        this.work = work;
    }
    @Override
    public void work() {
        work.work();
        System.out.println("干完活收拾下房间");//增强的功能
    }
}

public class Test {
    public static void main(String args[]) {
        //需要6个类,如果再有一个Student,一个Women……还需要【1*3*n】个类(1*的意思是IWork中只有一个方法)
        IWork work1 = new Robot();
        IWork work2 = new RobotV2();
        IWork work3 = new RobotV3();
        IWork work4 = new People();
        IWork work5 = new PeopleV2();
        IWork work6 = new PeopleV3();
        work1.work();
        System.out.println();
        work2.work();
        System.out.println();
        work3.work();
        System.out.println();
        work4.work();
        System.out.println();
        work5.work();
        System.out.println();
        work6.work();
        System.out.println("\n========================\n");

        //只需要4个类即可实现以上所有功能,如果再有一个Student,一个Women……还需要【1*n】个类
        IWork work11 = new Robot();
        Decorator decorator1 = new Decorator(work11);
        DecoratorV2 decorator2 = new DecoratorV2(work11);
        work11.work();
        System.out.println();
        decorator1.work();
        System.out.println();
        decorator2.work();
        System.out.println();

        IWork work12 = new People();
        decorator1 = new Decorator(work12);
        decorator2 = new DecoratorV2(work12);
        work12.work();
        System.out.println();
        decorator1.work();
        System.out.println();
        decorator2.work();
        System.out.println();
    }
}





附件列表

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值