装饰者设计模式
什么是装饰者设计模式
-
可以在不修改目标类 也不使用继承的情况下,动态的扩展一个类的功能,它是通过传概念一个包装对象来达到增强目标类的目的
-
要求:
-
装饰者类与目标类要实现相同的接口,或继承自相同的抽象类
-
装饰者类中要求有目标类的应用作为成员变量,而且具体的赋值通过带参构造器完成
-
普通装饰者设计
-
目标类,输出一串字符串
//业务逻辑接口
//目标类
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
}
}