什么是装饰着模式
Java23中设计模式之一,可以动态的给对象添加功能但又不改变对象的原有结构,或者可以理解为增强对象的方法;譬如克莱儿小姐要去约会,在约会前要先化妆,也就是要进行装饰和增强,这样在约会的过程中可以更加的美好。
装饰着模式的技术实现
实现思路及图解
现有两个对象分别为:被装饰对象A和装饰对象B,他们都实现了相同的接口C,在装饰对象B中获得被装饰兑现A的引用,这样就可以在B中对A对象的一些方法进行装饰或者说进行增强。
代码实现
定义接口
创建谈恋爱的接口:FallInLove
/*
创建恋爱接口
*/
public interface FallInLove {
/**
* 定义一个约会的抽象方法
*/
public abstract void dating();
}
定义被装饰的对象
定义克莱儿对象,实现谈恋爱接口,重写约会方法,方法内容为今晚8点北京饭店约见男神
/**
* 被装饰的对象:克莱儿
*/
public class Claire implements FallInLove {
/**
* 实现约会的方法:今晚8点北京饭店约见男神
*/
@Override
public void dating() {
System.out.println("今晚8点北京饭店约见男神");
}
}
定义装饰的对象
定义装饰克莱儿的对象,实现谈恋爱接口,并获得克莱尔对象的引用,重写约会的方法,方法的内容为6点钟先去美发店做个美发,化妆师化个妆,然后再8点北京饭店约见男神
/**
* 装饰类
*/
public class DecorateClaire implements FallInLove {
/**
* 被装饰的对象的引用,因为被装饰的对象也实现了FallInLove接口,因此引用的类型声明为接口类型
*/
private FallInLove fallInLoveObject;
/**
* 为了保证装饰对象中能够获得被装饰对象的引用,因此重载构造方法,需要传入被装饰的对象
* @param fallInLoveObject:被装饰的对象,也就是本例中的克莱儿
*/
public DecorateClaire(FallInLove fallInLoveObject) {
this.fallInLoveObject = fallInLoveObject;
}
/**
* 重写约会方法:增强实现
*/
@Override
public void dating() {
//对克莱儿进行装饰
System.out.println("6点钟先去美发店做个美发,化妆师化个妆");
//让克莱儿去约会
this.fallInLoveObject.dating();
}
}
测试装饰结果
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
//创建克拉尔对象
Claire claire = new Claire();
//创建装饰着对象,构造方法中传入克莱儿对象
DecorateClaire decorateClaire = new DecorateClaire(claire);
//调用装饰对象中约会的方法
decorateClaire.dating();
}
}
运行结果:
6点钟先去美发店做个美发,化妆师化个妆
今晚8点北京饭店约见男神
总结:
装饰着模式能够动态的增强一个对象的功能,且无需改变对象的原有结构。装饰类和被装饰类可以独立发展,不会相互耦合。如果我们想在不增加很多子类的情况下扩展类,那么就可以使用装饰着模式。