装饰者设计模式

装饰者设计模式

什么是装饰者设计模式

  • 可以在不修改目标类 也不使用继承的情况下,动态的扩展一个类的功能,它是通过传概念一个包装对象来达到增强目标类的目的

  • 要求:

    • 装饰者类与目标类要实现相同的接口,或继承自相同的抽象类

    • 装饰者类中要求有目标类的应用作为成员变量,而且具体的赋值通过带参构造器完成

普通装饰者设计

  • 目标类,输出一串字符串

//业务逻辑接口
//目标类
public interface ISomeService {
    String  doSome();
​
}
//目标类
public class SomeService implements ISomeService{
    @Override
    public String doSome() {
        return "aadadads";
    }
}
  • 需求:使用装饰者设计模式,将目标类输出的字符串进行大写输出

  • 解决:

    • 1、装饰者需要实现与目标类相同的接口

    • 2、装饰者类中要有目标对象作为成员变量,并且目标对象是由带参构造器传入

//装饰者
//1、装饰者要实现与目标类相同的接口
//2、装饰者类中要有目标对象作为成员变量,且目标对象时是由带参构造器传入的
public class SomeServiceDecorator implements ISomeService{
    private ISomeService traget;  //目标对象
    //通过带参构造器出入目标对象
    public SomeServiceDecorator(ISomeService traget){
        super();
        this.traget =traget;
    }
​
    @Override
    public String doSome() {
        return traget.doSome().toUpperCase();
    }
}
  • 测试类

public class MyTest {
    public static void main(String[] args) {
        //创建目标类
        ISomeService iSomeService = new SomeService();
        System.out.println(iSomeService.doSome());
        //创建装饰者
        ISomeService target = new SomeServiceDecorator(iSomeService);
        String s = target.doSome();
        System.out.println(s);
    }
}

复杂装饰者设计模式

  • 需求:在输出大写字符串的基础之上 , 去除字符串的前后空格

  • 创建装饰者基类

    • 要有无参构造器

    • 不对目标类的目标方法进行任何的增强

  • 创建具体装饰者

    • 继承装饰者基类

    • 实现带参和无参构造器

    • 具体装饰者只对装饰者基类基本业务进行某一种单一的增强

  • 测试类

    • 创建目标类

    • 创建具体装饰者类,将目标类作为参数进行传递

    • 第一个装饰者类,作为另一个具体装饰者类的参数,形成“装饰者链”

  • 装饰者基类

//装饰者的基类
//要求1、要有无参构造器
//2、不对目标类的目标方法进行任何增强
public class SomeServiceWrapper implements ISomeService{
    //目标对象
    private ISomeService target;
    //通过带参构造器传入目标对象
    public SomeServiceWrapper(ISomeService target){
        super();
        this.target = target;
    }
    @Override
    public String doSome() {
        //调用目标类的目标方法,但不对其进行任何的增强
        return target.doSome();
    }
​
    public SomeServiceWrapper() {
    }
}
  • 具体装饰者

public class UpperDecorator extends SomeServiceWrapper{
    public UpperDecorator(){
​
    }
    public UpperDecorator(ISomeService target){
        super(target);
    }
    //重写基类的业务方法
    @Override
    public String doSome() {
        //调用基类的业务方法,并对其进行增强
        return super.doSome().toUpperCase();
    }
}
public class TrimDecorator extends SomeServiceWrapper{
    public TrimDecorator(){
​
    }
    public TrimDecorator(ISomeService target){
        super(target);
    }
    //重写基类的业务方法
    @Override
    public String doSome() {
        //调用基类的业务方法,并对其进行增强
        return super.doSome().trim();
    }
}
  • 测试类

public class MyTest {
    public static void main(String[] args) {
        //创建目标类
        ISomeService target= new SomeService();
        //创建装饰者
        ISomeService service = new TrimDecorator(target);
        ISomeService service2 = new UpperDecorator(target);
        //将第一次增强过的结果作为第二次增强的参数,形成”装饰者链“
        ISomeService service3 = new UpperDecorator(service);
        System.out.println("service:去除前后空格"+service.doSome());  //service:去除前后空格aadadads
        System.out.println("service1:字母大写"+service2.doSome());   //service1:字母大写     AADADADS      
        System.out.println("service3:字母大写并且去除空格,UpperDecorator调用TrimDecorator"+service3.doSome());   //service3:字母大写并且去除空格,UpperDecorator调用TrimDecoratorAADADADS
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值