装饰者模式
定义:动态地给一个对象添加一些额外的职责,提供了比子类更加灵活的增强功能的方式。
优点:1、装饰者模式和继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活型。
2、通过使用不同的具体装饰者类及不同的组合顺序,可以得到不同装饰后具有不同行为或者状态的对象。
3、符合开闭原则。
缺点:1、增加了抽象装饰者类和具体装饰者类,一定程度增加了系统的复杂度,加大了系统的学习和理解成本。
2、灵活性也意味着更容易出错,对于多次被多次修饰的对象,调试时寻找错误可能需要找到多个地方。
使用场景:
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、需要动态地给一个对象增加功能,这些功能也可以动态地被撤销,当不能采用继承的方式对系统进行扩 充或者采用继承不利于系统扩展和维护时。
定义一个抽象对象
package com.sj.decoratorpattern;
public interface GreatMonkey {
void change();
}
定义抽象对象的具体实现对象
package com.sj.decoratorpattern;
public class ChinaMOnkey implements GreatMonkey {
@Override
public void change() {
System.out.println("有七十二种变化");
}
}
定义抽象的装饰对象实现抽象对象接口,构造方法有对被装饰对象的引用
package com.sj.decoratorpattern;
public abstract class Decorator implements GreatMonkey {
private GreatMonkey greatMonkey;
public Decorator(GreatMonkey greatMonkey) {
this.greatMonkey = greatMonkey;
}
@Override
public void change() {
greatMonkey.change();
}
}
创建具体的装饰对象,继承抽象装饰的装饰对象,在具体实现类中进行对象功能的拓展
package com.sj.decoratorpattern;
public class ConcreteDecortor extends Decorator {
public ConcreteDecortor(GreatMonkey greatMonkey) {
super(greatMonkey);
}
@Override
public void change() {
super.change();
this.extra();
}
public void extra(){
System.out.println("并且还会飞");
}
}
创建测试类进行测试
package com.sj.decoratorpattern;
public class Consumer {
public static void main(String[] args) {
//装饰前
GreatMonkey greatMonkey = new ChinaMOnkey();
greatMonkey.change();
System.out.println("=============");
//装饰后
ConcreteDecortor concreteDecortor= new ConcreteDecortor(greatMonkey);
concreteDecortor.change();
}
}
/*
输出结果:
有七十二种变化
=============
有七十二种变化
并且还会飞
*/