Decorator 装饰器模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
优点:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
缺点: 装饰模式会增加许多子类,过度使用会增加程序得复杂性。
实例: 对已有功能扩展,比如对一个人的姓名字符串添加后缀(只是演示)
//父类接口
interface Person {
String getName();
}
//普通实现
class nomalPerson implements Person{
String name;
public nomalPerson(String name) {
this.name = name;
}
@Override
public String getName(){
return name;
}
}
//需要扩展,给名字添加后缀--搞个装饰器抽象类
abstract class Decorator implements Person{
protected Person person;
public Decorator(Person person) {
this.person = person;
}
@Override
public String getName() {
return person.getName();
}
}
//具体的装饰器类 (可以添加新方法来完成功能)
class DecoratorImpl extends Decorator{
public DecoratorImpl(Person person) {
super(person);
}
public String appendName(){
return this.person.getName()+"后缀";
}
}
//具体的装饰器类(还可以通过重写完成)
class DecoratorImpl2 extends Decorator{
public DecoratorImpl2(Person person) {
super(person);
}
public String getName(){
return super.getName() + "后缀";
}
}
class test{
public static void main(String[] args) {
//原有功能
nomalPerson np = new nomalPerson("张三");
System.out.println(np.getName());
//扩展(第一种方式)
DecoratorImpl di = new DecoratorImpl(np);
System.out.println(di.appendName());
//扩展(第二种方式)
DecoratorImpl2 di2 = new DecoratorImpl2(np);
System.out.println(di2.getName());
/** 打印结果
张三
张三后缀
张三后缀
*/
}
}