您的位置:首页 > 编程语言 > Java开发

Java设计模式学习—装饰者模式(Decorator)

2017-12-10 17:38 423 查看
装饰者模式:动态的将职责添加到对象上,相比继承来扩展类的功能,装饰者模式更为灵活。

装饰者设计模式设计原则

1)、多用组合,少用继承;继承设计子类的行为在编译时静态决定,所有子类都会继承到相同的行为,如果采用组合的方式,就可以再运行过程中动态的对类进行扩展;

2)、被修饰类对外扩展开放,对修改关闭;

3)、装饰者和被装饰者具有相同的超类型

代码解释:

/**装饰者与被装饰者的相同超类型**/
interface SuperClass{
public void fun();
}
/**被装饰者类
被装饰的类是一个抽象类,抽象类不能实例化,需要通过子类来实例化
**/
abstract class DecoratedClass implements SuperClass{
private SuperClass sc;
public DecoratedClass(SuperClass sc){
this.sc = sc;
}
public void fun(){
sc.fun();
}
}
/**装饰者1**/
class DecoratorOne extends DecoratedClass{
public DecoratorOne(SuperClass sc){
super(sc);
}
public void fun(){
super.fun();
addFun1();
}
public void addFun1(){
}
}
/**装饰者2**/
class DecoratorTwo extends DecoratedClass{
public DecoratorTwo(SuperClass sc){
super(sc);
}
public void fun(){
super.fun();
addFun2();
}
public void addFun2(){
}
}
class SubSuperClass implements SuperClass
{
public void fun(){}
}
public class DecoratorTest{
public static void main(String[]args){
SuperClass sc = new SubSuperClass();
SuperClass sc1 = new DecoratorOne(sc);
SuperClass sc2 = new DecoratorTwo(sc1);
sc2.fun();

}
}




通过该例子我们来分析装饰者如何给被装饰者动态扩展:

step1:sc2调用fun()方法,此时fun方法体调用super.fun(),即DecoratedClass

类的fun方法,该方法用调用超类型的fun()方法,此时超类形的实现是DecoratorOne,即调用的是DecoratorOne的fun方法,该方法里又调用super.fun(),方法体的实现是调用超类的fun(),而此时超类的实现是SubSuperClass,因此调用该类的fun()方法,层层相扣,从SubSuperClass的fun扩展到DecoratorTwo的fun.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: