博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰者模式
阅读量:4308 次
发布时间:2019-06-06

本文共 1952 字,大约阅读时间需要 6 分钟。

装饰者模式的实现有两个要求:

1.装饰者类与目标类要实现相同的借口,或者继承自相同的抽象类。
2.装饰者类中要有目标类的引用作为成员变量,具体的赋值一般通过带参构造器完成。

按着这两个要求我们进行类的编写。

目标类:

//接口package com.wk.decorator;public interface IMyService {         String sayHello();}//实现类package com.wk.decorator;public class IMyServiceImpl implements IMyService {    @Override    public String sayHello() {                return "hello";    }}

装饰者基类

package com.wk.decorator;//装饰者基类:不对目标类进行增强 ,无参构造,目标对象引用public class DecoratorBase implements IMyService {    protected IMyService target;        public DecoratorBase() {        super();    }    public DecoratorBase(IMyService target) {        this.target = target;    }    @Override    public String sayHello() {        //调用目标方法 不增强。        return target.sayHello();    }}

具体装饰者类

//具体装饰者类1package com.wk.decorator;//具体装饰类:继承基类,单一增强。有参构造。public class WhoSay extends DecoratorBase {    public WhoSay(IMyService target) {        super(target);    }      //重写基类业务方法 增强。    @Override    public String sayHello() {        return "Jack say " +super.sayHello();    }}//具体装饰者类2package com.wk.decorator;public class toWho extends DecoratorBase {    public toWho(IMyService target) {        super(target);    }       @Override    public String sayHello() {        // TODO Auto-generated method stub        return super.sayHello()+" to Tom";    }}

测试:

package com.wk.decorator;public class Test {    public static void main(String[] args) {       //创建目标对象         IMyService target=new IMyServiceImpl();         //使用目标对象作为参数,创建装饰者类         IMyService who=new WhoSay(target);                  String one=who.sayHello();         System.out.println(one);         //将第一次增强的结果作为第二次增强的参数出现,形成“装饰者链”         IMyService towho=new toWho(who);                  String two=towho.sayHello();         System.out.println(two);            }}

测试结果:

Jack say helloJack say hello to Tom

 看完装饰者模式你是不是想到了静态代理模式。觉得两者之间有点相似。若是你能有如此想法,那么不妨读一下本博文的静态代理模式。具体讲解两者的相同点与不同点。

转载于:https://www.cnblogs.com/wangyanei2017/p/9213813.html

你可能感兴趣的文章
Activiti工作流会签三 撤销,审批,驳回
查看>>
Oauth2方式实现单点登录
查看>>
CountDownLatch源码解析加流程图详解--AQS类注释翻译
查看>>
ES相关度评分
查看>>
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>